Je suppose que le projet en cours de migration à partir de Java 1.8 n'a pas encore d' module-info.java
. Cela implique que vous compilation d'un code dans le "sans nom de module".
Code dans le sans nom module "lit" tous les observables nommés ou anonymes modules, en particulier, il lit module "java.xml" à partir de la JRE System Library. Ce module exportations paquet comme java.xml.xpath
.
En outre, vous avez xml-apis.java
sur le chemin de la classe, ce qui contribue à une autre série de paquets de la même noms (java.xml.xpath
et les amis). Ce sont dit d'être associé à sans nom de module, comme votre propre code.
Cette situation viole l' exigence de "une visibilité unique" tel que défini dans JLS §7.4.3 (dernier paragraphe). En particulier, tous les qualifiés du nom de type Q. Id (JSL §6.5.5.2) exige que son préfixe Q est un unique visible paquet (je suis ignorant le cas d'imbrication des types pour des raisons de simplicité). Ergo: le programme est illégale et doit être rejeté par les compilateurs.
Ce qui nous laisse avec une question et deux solutions:
(1) Question: Pourquoi est-javac accepter le programme?
(2) Solution: Si vous ajoutez module-info.java
de votre projet, vous pouvez contrôler via nécessite le module de votre projet de lit, soit requires java.xml;
ou requires xml.apis;
(où "xml.api" est le module automatique nom de "xml-apis-1.4.01.jar).
(3) la Solution: Court de transformer votre projet en un module, vous pouvez encore éviter le conflit en excluant java.xml
de l'ensemble des observables modules. Sur la ligne de commande ce qui serait fait à l'aide d' --limit-modules
. L'équivalent dans Eclipse est la "Modularité Détails" de la boîte de dialogue, voir aussi le JDT 4.8 Nouveau et digne d'intérêt (voir le Contenu de l'onglet). Depuis java.xml
est implicitement requise par beaucoup d'autres par défaut observables modules, il peut être une bonne idée de pousser tout, sauf pour java.base
à partir de la droite ("Explicitement inclus les modules") à gauche ("modules") (et de manière sélective rajouter les modules besoins de votre projet).
PS: Eclipse ne propose pas encore un idéal de message d'erreur, au lieu de "ne peut pas être résolu", il devrait en fait dire: "Le package javax.xml.xpath est accessible à partir de plus d'un module: javax.xml, <sans nom>.
PPS: Aussi bizarre: comment se fait-que la modification de l'ordre entre les JRE et un jar dans le classpath (par exemple la commande n'est pas un concept soutenu par javac ni JEP 261) modifie le comportement du compilateur.
Modifications:
- Alex Buckley a confirmé que la situation est illégale, en dépit de ce que javac dit. Bug contre javac a été soulevée comme JDK-8215739. Ce bogue a été reconnue mois avant la sortie de Java 12. Comme de 2019-06 il a été décidé également de Java 13 expédier sans un correctif. De même pour Java 14.
- Eclipse message d'erreur a été améliorée de mentionner le réel problème.
- Dans Eclipse 2019-06 l'INTERFACE utilisateur utilisé pour la Solution (3) a été remanié. La mise à jour de la documentation peut être trouvée dans l' aide en ligne.