J'ai un projet qui utilise cette technique qui fonctionne très bien dans JDK 8 et plus. Cependant, dans JDK 9, ce fichier a été supprimé et ne fonctionne plus:
'dependencies.dependency.systemPath' pour com.Sun: tools: jar fait référence à un fichier non existant /usr/lib/jvm/Java-9-jdk/../lib/tools.jar. Vérifiez que vous exécutez Maven à l’aide d’un JDK et pas uniquement d’un JRE.
(Le chemin semble étrange, bien qu'il y ait no tools.jar dans JDK 9 )
Quelle est la meilleure pratique qui fonctionnerait entre les versions de JDK et peut-être même les fournisseurs de JDK? Je n'ai même pas trouvé de solution de contournement pour JDK 9 sur OpenJDK (tout en gardant le projet compilable sur JDK 8).
Vos problèmes sont causés par les modifications apportées à Project Jigsaw dans la version de Java 9 EA que vous semblez avoir utilisée. JEP 220 les décrit.
La section Supprimée: rt.jar
et tools.jar
décrit cela plus en détail, mais Risques et hypothèses contient un bon résumé:
Comme indiqué ci-dessus, les images JDK et JRE ne contiennent plus les fichiers
lib/rt.jar
,lib/tools.jar
,lib/dt.jar
et d'autres fichiers jar internes. Le code existant qui suppose l'existence de ces fichiers peut ne pas fonctionner correctement.
Donc, comme vous l'avez observé, ces fichiers ont disparu. Plus bas:
Les fichiers de classe et de ressources précédemment trouvés dans
lib/tools.jar
et visibles uniquement lorsque ce fichier a été ajouté au chemin de classe seront désormais visibles dans une image JDK via le chargeur de classes système ou, dans certains cas, le chargeur de classes d'amorçage. Les modules contenant ces fichiers ne seront toutefois pas mentionnés dans le chemin de la classe d'application, c'est-à-dire, dans la valeur de la propriété systèmeJava.class.path
.
Ainsi, les classes de tools.jar
sont déplacées dans des modules, mais il semble qu'elles ne soient peut-être pas disponibles pour l'utilisateur. Vous devriez utiliser jdeps à partir d'une version récente de Jigsaw ...
$jdeps -M -s $your_JAR
jdeps -jdkinternals $your_JAR
Si vous avez de la chance, l'API que vous utilisez a été publiée (elle n'apparaîtra pas dans la deuxième analyse) ou aura une alternative publique (répertoriée par la deuxième analyse). Sinon, vous devriez envisager de le placer sur la liste de diffusion Jigsaw et demander de l'aide, en indiquant explicitement les API que vous utilisez et pour quoi faire.
Il s'avère que la solution compatible JDK 9 n'est pas si différente de l'astuce originale :
<profiles>
<profile>
<id>jigsaw</id>
<activation>
<jdk>[1.9,)</jdk>
</activation>
<!-- No dependencies needed by Jigsaw -->
<dependencies/>
</profile>
<profile>
<id>default-jdk</id>
<activation>
<file>
<exists>${Java.home}/../lib/tools.jar</exists>
</file>
</activation>
<dependencies>
<dependency>
<groupId>com.Sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<version>1.6</version>
<systemPath>${Java.home}/../lib/tools.jar</systemPath>
</dependency>
</dependencies>
</profile>
<profile>
<id>osx-jdk</id>
<activation>
<file>
<exists>${Java.home}/../Classes/classes.jar</exists>
</file>
</activation>
<dependencies>
<dependency>
<groupId>com.Sun</groupId>
<artifactId>tools</artifactId>
<scope>system</scope>
<version>1.6</version>
<systemPath>${Java.home}/../Classes/classes.jar</systemPath>
</dependency>
</dependencies>
</profile>
</profiles>
Si des déclarations dependency
entières sont déplacées vers la profile
, cela permet à différents profils d’utiliser un nombre différent de dépendances.
J'ai créé un module réutilisable pour masquer la complexité d'un projet individuel qui dépend de tools.jar:
<dependency>
<groupId>com.github.olivergondza</groupId>
<artifactId>maven-jdk-tools-wrapper</artifactId>
<version>0.1</version>
</dependency>
Votre solution (simple solution de contournement) est considérée comme défectueuse et not fonctionnera avec Java 9. Tout ce que vous pouvez faire est d’exécuter jdeps
et de déplacer votre code vers des API publiques.