web-dev-qa-db-fra.com

Déclarez la dépendance de maven sur tools.jar pour travailler sur JDK 9

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).

12
Oliver Gondža

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.jardé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ème Java.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 ...

  • ... pour déterminer vos dépendances de modules: $jdeps -M -s $your_JAR
  • ... pour déterminer les dépendances sur les API internes au JDK: 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.

15
Nicolai

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>
5
Oliver Gondža

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.

0
Michael-O