web-dev-qa-db-fra.com

Dans Eclipse, quelle est la différence entre modulepath et classpath?

Dans Eclipse, quelle est la différence entre modulepath et classpath, et lequel dois-je utiliser pour ajouter un fichier jar dans le dossier lib? Et pourquoi la bibliothèque système JRE apparaît-elle dans modulepath?

22
QuantumQuaver

Le système de module a principalement l’impact suivant sur le code:

  • Un package n’est accessible qu’à partir d’un seul module (les packages imbriqués sont traités séparément). Ainsi, même si le package Java.util Se trouve dans le module Java.base, Le package Java.util.logging Peut y figurer. le module Java.logging)
  • Vous ne pouvez accéder aux champs publics et aux méthodes de code que dans les packages exportés d'autres modules. Ceci est vrai même avec une réflexion (c'est-à-dire que Java.lang.reflect.AccessibleObject.setAccessible(boolean) ne fonctionne que pour le code dans le même module)

Tout le code qui se trouve sur le chemin de classe vit ensemble dans le module "non nommé". Tous les codes du modulepath résident dans leurs propres modules "nommés".

Vous devez distinguer deux cas:

  • Si vous n'ajoutez pas de module-info.Java à votre projet, votre projet fera partie du module sans nom et pourra voir tout le code du module sans nom, plus le code dans Java.base Et le code dans les modules dans Java.se Module racine. Fondamentalement, cela signifie que w.r.t. code sur le chemin de classe, tout fonctionne toujours comme dans Java 8, vous devriez donc simplement mettre vos dépendances sur le chemin de classe.

  • Si vous avez un module-info.Java dans votre projet, votre projet sera dans son propre module nommé et ne peut voir que le code dans Java.base Et les autres modules nommés qui sont des références utilisant les clauses "require" dans le module. -info.Java. Comme les modules nommés ne sont trouvés que via le chemin du module, vous devez placer vos dépendances sur le chemin de classe. Cela fonctionne même pour les jars créés avant Java 9, qui obtiendront un nom de module dérivé du nom de fichier .jar (dans ce cas, ils sont appelés module "automatique").

Le JRE est toujours sur le chemin du module, de sorte que son code interne ne peut pas être accédé même à partir du code sur le chemin de classe.

Il existe un cas particulier: si vous avez un module-info.Java dans votre projet et que vous avez un code de test dans votre projet, vous ne voulez généralement pas mentionner les dépendances de test comme junit dans le module-info.Java. Il y a deux solutions pour cela:

  • Créez un module de test dédié. Cela a toujours été la convention pour les projets basés sur osgi. L'inconvénient est que vous ne pouvez utiliser qu'une API publique dans vos tests.

  • La solution utilisée par maven: Placez vos dépendances de test sur le classpath. Lors de la compilation du code de test, maven ajoute des options de ligne de commande permettant au code du module nommé de lire le module non nommé (ce qui n'est pas possible via le module-info.Java).

Dans Eclipse Oxygen, la solution Maven n’était pas possible car elle ne savait pas quel code était le code de test, mais cela a été mis en œuvre dans la prochaine version d’Eclipse Photon (4.8), qui sortira en juin. Vous pouvez déjà utiliser les versions de jalon (complètes) de http://download.Eclipse.org/Eclipse/downloads/ . Si vous trouvez des bogues, veuillez les signaler à https://bugs.Eclipse.org/bugs/ .

15
Till Brychcy