2016-02-06 13 views
5

Ho un progetto che utilizza this technique che funziona correttamente in JDK 8 e precedenti. Tuttavia, in JDK 9 questo vaso è stato rimosso e funziona più:Dichiara la dipendenza di maven su tools.jar per funzionare su JDK 9

'dependencies.dependency.systemPath' per com.sun: Strumenti vaso si riferisce ad un file non esistente/usr/lib/jvm /java-9-jdk/../lib/tools.jar. Verifica di eseguire Maven usando un JDK e non solo un JRE.

(Il percorso sembra strano, se non v'è alcun tools.jar in JDK 9)

Qual è la prassi migliore che avrebbe funzionato tra le versioni del JDK e forse anche fornitori JDK? Non ho ancora trovato alcuna soluzione alternativa per JDK 9 su OpenJDK (mantenendo il progetto realizzabile su JDK 8).

risposta

0

soluzione You (mera soluzione) è considerata essere rotto e sarà non lavoro con Java 9. Tutto si può fare è gestito jdeps e spostare il codice per API pubbliche.

+0

Questo è vero per quanto riguarda la teoria va. Il problema è che le API "pubbliche" sono spesso fornite dalle classi in 'tools.jar', quindi per mantenere il progetto costruibile per i JDK più vecchi è necessario affrontare questo problema. –

10

I problemi sono causati dalle modifiche di Project Jigsaw apportate alla build di Java 9 EA che sembra aver utilizzato. JEP 220 li descrive.

La sezione Rimosso: rt.jar e tools.jar descrive più in dettaglio, ma rischi e ipotesi contiene una buona sintesi:

JDK e JRE immagini sarà, come già detto, non contengono più i file lib/rt.jar, lib/tools.jar, lib/dt.jar e altri file jar interni. Il codice esistente che presuppone l'esistenza di questi file potrebbe non funzionare correttamente.

Così come avete notato, quei file sono spariti. Più in basso:

File di classe e di risorse precedentemente trovati in lib/tools.jar e visibile solo quando il file è stato aggiunto al percorso di classe sarà ora, un'immagine JDK in, essere visibili tramite il caricatore di classe di sistema o, in alcuni casi, il caricatore di classe bootstrap. I moduli contenenti questi file non saranno tuttavia menzionati nel percorso della classe dell'applicazione, , ovvero, nel valore della proprietà di sistema java.class.path.

Quindi le classi da tools.jar vengono spostate in moduli ma sembra che potrebbero non essere disponibili per l'utente. Si dovrebbe usare jdeps da una recente costruzione Jigsaw ...

  • ... per determinare le dipendenze dei moduli: $jdeps -M -s $your_JAR
  • ... per determinare le dipendenze sulle API JDK-interne: jdeps -jdkinternals $your_JAR

Se sei fortunato, l'API che stai usando è stata pubblicata (quindi non verrà visualizzata nella seconda analisi) o avrà un'alternativa pubblica (che la seconda analisi dovrebbe elencare).Altrimenti dovresti prendere in considerazione questo allo Jigsaw mailing list e chiedere aiuto lì, notando esplicitamente quali API stai usando e per cosa.

+0

Grazie, questo è utile per capire di cosa esattamente dipendo, ma nel caso di tools.jar, non aiuta a far sì che Maven si costruisca nel caso in cui dipendo da uno dei moduli integrati. –

+0

Questo è utile per sapere in altri contesti, come se (come me) si abbiano doclet Javadoc personalizzati esistenti e sia necessario capire come compilarli con Java 9. – mhucka

2

Risulta la soluzione consapevole JDK 9 non è così differente dalla original trick:

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

se tutto il dependency dichiarazioni vengono spostati nella profile consente profili differenti per usare diverso numero di dipendenze.


ho creato un reusable module per nascondere la complessità di progetto individuale che dipende tools.jar:

<dependency> 
    <groupId>com.github.olivergondza</groupId> 
    <artifactId>maven-jdk-tools-wrapper</artifactId> 
    <version>0.1</version> 
</dependency> 
Problemi correlati