web-dev-qa-db-fra.com

Quelle est la différence entre les modules et les fichiers JAR?

J'apprends Java 9 de Quoi de neuf dans Java9 et l'un des sujets chauds de la discussion est Le JDK modulaire .

Les fichiers JAR sont-ils des modules?

En quoi un module est-il différent d'un fichier JAR?

20
Neeraj Jain

Module : Une nouvelle fonctionnalité langue introduite dans Java 9 (similaire à la classe , interface, package, etc.) qui consiste en une collection de packages, semblable à la façon dont un package se compose d'une collection de types.

[~ # ~] jar [~ # ~] : format de fichier d'archive qui regroupe le code et les ressources et qui peut être chargé par la JVM.

Plus précisément, un module est défini comme suit :

Afin de fournir une configuration fiable et une encapsulation solide d'une manière qui soit à la fois accessible aux développeurs et supportable par les chaînes d'outils existantes, nous traitons les modules comme un nouveau type fondamental de composant de programme Java. A module est une collection nommée et auto-descriptive de code et de données. Son code est organisé comme un ensemble de packages contenant des types, c'est-à-dire Java classes et interfaces; ses données incluent des ressources et d'autres types d'informations statiques.

...

L'auto-description d'un module est exprimée dans sa déclaration de module, une nouvelle construction du langage de programmation Java.

...

Une déclaration de module est compilée, par convention, dans un fichier nommé module-info.class, placé de la même manière dans le répertoire de sortie du fichier de classe.

Un module peut être compilé dans un fichier Jar, auquel cas le fichier Jar est étiqueté un fichier Jar modulaire:

Les outils existants peuvent déjà créer, manipuler et consommer des fichiers JAR, donc pour faciliter l'adoption et la migration, nous définissons fichiers JAR modulaires. Un fichier JAR modulaire est comme un fichier JAR ordinaire de toutes les manières possibles, sauf qu'il comprend également un module-info.class fichier dans son répertoire racine.

Quelques autres différences entre un module et un JAR:

  1. Les modules peuvent nécessitent d'autres modules afin de permettre l'accès aux classes dépendantes par le module requis. Un pot n'a pas un tel concept de dépendance.

  2. Un module peut décider quelles classes et interfaces exporter vers d'autres modules qui en ont besoin. Un pot n'a pas un tel mécanisme d'encapsulation.

  3. Un module peut être compilé dans un fichier Jar modulaire, mais certains modules (par exemple les modules JDK) sont compilés dans un autre format appelé JMOD.

  4. Le nom d'un JAR peut être modifié. Tant que le chargeur de classe JVM trouve la classe requise sur le chemin de classe (qui peut être composé d'un seul JAR, de plusieurs JAR ou d'un mélange entre répertoires ou JAR), le nom du fichier JAR peut être n'importe quoi. Cependant, le nom d'un module peut être explicitement référencé dans la déclaration d'autres modules, et tel le nom le définit et ne peut pas être modifié librement.

15
manouti

À strictement parler, un module est un concept d'exécution. Comme d'autres l'ont cité L'état du système du module :

Un module est une collection nommée et auto-descriptive de code et de données. Son code est organisé comme un ensemble de packages contenant des types, c'est-à-dire Java classes et interfaces; ses données incluent des ressources et d'autres types d'informations statiques.

C'est très similaire aux JAR , mais ...

  1. Les fichiers JAR n'ont aucune représentation significative au moment de l'exécution
  2. Les fichiers JAR ne sont pas "auto-descriptifs", ce qui signifie dans ce cas qu'ils n'ont pas de nom qui intéresse la JVM, ne peuvent pas exprimer de dépendances ou définir une API appropriée

Cela laisse la question, d'où viennent les modules? Il existe différentes manières, mais la plus importante pour les développeurs est le JAR modulaire. Un JAR modulaire est comme un JAR ordinaire, mais il contient un descripteur de module , un fichier module-info.class qui a été compilé à partir d'un module-info.Java. C'est ce fichier qui définit le nom d'un module, les dépendances et les API .

Il existe donc une forte connexion entre les JAR et les modules: les JAR sont les conteneurs à partir desquels le système de modules crée des modules et (à l'heure actuelle) chaque JAR ne peut contenir qu'un seul module. Il est important de noter que même sur Java 9 JAR ne sont pas ont pour être modulaire - les JAR simples sont tout à fait corrects.

8
Nicolai

Les fichiers JAR sont-ils des modules? En quoi le module est différent du fichier JAR?

Non, un Java Archive n'est pas un Module.

Juste pour un exemple, alors que les classes de le même package aurait pu être réparti sur les JAR , le même package maintenant ne peut pas être lu à partir de plusieurs modules.

Un pot [~ # ~] [~ # ~] est un format de fichier qui vous permet de regrouper plusieurs fichiers dans un seul fichier d'archive. Il contient généralement les fichiers de classe et les ressources auxiliaires associés aux applets et applications.

d'autre part (j'avais essayé de le décrire ici ~> module Java également)

Un module est une collection nommée et auto-descriptive de code et de données. Son code est organisé comme un ensemble de packages contenant des types, c'est-à-dire Java = classes et interfaces; ses données incluent des ressources et d'autres types d'informations statiques.

Cela comprend également la déclaration de module spécifiée à l'aide de module-info.Java.

Chaque définition de module est soit

  • A module artefact, c'est-à-dire un fichier JAR modulaire ou un fichier JMOD contenant une définition de module compilée, sinon

  • Un répertoire du module éclaté dont le nom est, par convention, le nom du module et dont le contenu est une arborescence de répertoires "éclatés" correspondant à une hiérarchie de packages.

Comme introduit avec le système de modules, une image modulaire est composée de modules plutôt que de fichiers JAR. La modularité est prévue pour une configuration dynamique en termes de fichier WAR modulaire également.


Mais pour la facilité d'adoption des modules un fichier JAR modulaire, a été introduit dans JDK9, ce qui permet de dire pour un module composé d'un module-info.Java tel que

module com.foo.bar { }

et d'autres Java classes comme

com/foo/bar/alpha/AlphaFactory.Java
com/foo/bar/alpha/Alpha.Java

Les outils existants peuvent déjà créer, manipuler et consommer des fichiers JAR. Un fichier JAR modulaire est comme un fichier JAR ordinaire de toutes les manières possibles, sauf qu'il inclut également un fichier module-info.class dans son répertoire racine. Un fichier JAR modulaire pour ce qui précède com.foo.bar module, par exemple, pourrait avoir le contenu:

META-INF/
META-INF/MANIFEST.MF
module-info.class
com/foo/bar/alpha/AlphaFactory.class
com/foo/bar/alpha/Alpha.class
...

Un fichier JAR modulaire peut être utilisé comme module, auquel cas son fichier module-info.class est considéré comme contenant la déclaration du module. Il peut également être placé sur le chemin de classe ordinaire, auquel cas son fichier module-info.class est ignoré.

7
Naman