2010-03-23 6 views
88

Sto provando a creare un plugin Hudson che ho modificato e richiede jdk1.6. Questo va bene, ma non vedo come posso dire a Maven dove si trova il diverso jdk. Ho trovato alcune menzioni su internet ma non sembrano applicarsi a me. Alcuni suggeriscono di aggiungere alcuni config a .m2/settings.xml ma non ho uno settings.xml. Inoltre, non voglio usare 1.6 per tutte le build di maven.Specifica JDK per Maven per utilizzare

Un nodo è che sto usando mvn in cygwin, se questo è importante. Sembra che dovrei essere in grado di fare le specifiche nel file pom del progetto, ma il pom esistente è piuttosto spoglio.

Quindi la linea di fondo è, c'è un modo per specificare un jdk per una singola invocazione di Maven?

risposta

81

Quindi la linea di fondo è, c'è un modo per specificare un jdk per una singola invocazione di Maven?

Cambia temporaneamente il JAVA_HOME.

+7

Esempio in Windows: 'set JAVA_HOME =" C : \ Java \ jdk7 "' – acdcjunior

+4

in lubuntu: JAVA_HOME = "/ home/desa/programas/jdks/jdk1.6.0_45 /" mvn -v –

+3

E nel caso in cui qualcun altro dimentica e trascorre anni chiedendosi perché non possono cambiarlo : 'JAVA_HOME' può essere impostato per Maven (almeno su Mac) in questo file:'/private/etc/mavenrc' - E questo può usare qualcosa di simile (notare gli apici inviolati non le virgolette singole!): '' Export JAVA_HOME = '/ usr/libexec/java_home -v 1.7.0_75'' ' – RedYeti

3

Hudson consente inoltre di definire diversi runtime Java e di invocare Maven con uno di questi. Dai un'occhiata più da vicino alla pagina di configurazione.

+0

L'OP sta costruendo un plugin hudson sulla riga di comando, non sotto hudson (almeno, questa è la mia comprensione). –

+0

Ho riletto la domanda - Penso che tu abbia letto bene. –

11

io vi dico di installazione JAVA_HOME come Pascal dice: In cygwin se si utilizza bash come shell dovrebbe essere "export JAVA_HOME =/cygdrive/c/pathtothejdk" E non danneggia esportare anche l'dir Java bin il PERCORSO con "export PATH = $ {JAVA_HOME}/bin: $ {PATH}"

e aggiungere anche maven-enforce-plugin per assicurarsi che venga utilizzato il jdk corretto. Questa è una buona pratica per il tuo pom.

<build> 
<plugins> 
    <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-enforcer-plugin</artifactId> 
     <executions> 
     <execution> 
      <id>enforce-versions</id> 
      <goals> 
      <goal>enforce</goal> 
      </goals> 
      <configuration> 
      <rules> 
       <requireJavaVersion> 
       <version>1.6</version> 
       </requireJavaVersion> 
      </rules> 
      </configuration> 
     </execution> 
     </executions> 
    </plugin> 
    </plugins> 
</build> 

http://maven.apache.org/plugins/maven-enforcer-plugin/usage.html

+1

Questo era perfetto per specificare la versione * esatta * del JDK. Ad esempio, ho un progetto che fallisce quando si utilizza il JDK 1.8 iniziale, ma se si utilizza JDK 1.8.0_77, funziona perfettamente. Avevo entrambi i JDK installati, e con questa soluzione Maven mi ha detto che stavo usando la versione errata di 1.8 finché non ho cambiato il mio percorso JAVA_HOME per indirizzare la specifica cartella 1.8.0_77. Le altre risposte non ti hanno permesso di essere così dettagliato sulla versione. – bojingo

+0

Felice che ti abbia aiutato! – feniix

17

come u ha detto "In più, non voglio usare 1.6 per tutti i Maven costruisce." .... Quindi meglio che posso dire modificare il file pom e specificare quale versione del JDK usare.

<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.7</source> 
       <target>1.7</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Assicurerà che il tuo progetto particolare usi quella versione di jdk.

+3

Questo è solo il punto di partenza, ma non la soluzione. Questo è il requisito per il plugin del compilatore maven da compilare per 1.7. E poi il trucco è rendere Maven veramente capace di compilare per 1.7, il che non è così banale se la tua attuale versione di Java è diversa ... –

+0

Questa è un'altra domanda http://stackoverflow.com/questions/16723533/how-do -you-specific-the-java-compilatore-versione-in-un-pom-xml-file –

4

Maven utilizza la variabile $ JAVACMD come comando java finale, la imposta su dove l'eseguibile java passa a JDK diverso.

61

sembra che Maven ora dà una soluzione qui: Compiling Sources Using A Different JDK

Diciamo che il vostro JAVA_HOME punti JDK7 (che verrà eseguito processi Maven)

tuo pom.xml potrebbe essere:

<build> 
    <plugins> 
     <!-- we want JDK 1.6 source and binary compatiblility --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.6</source> 
       <target>1.6</target> 
      </configuration> 
     </plugin> 
     <!-- ... --> 
     <!-- we want sources to be processed by a specific 1.6 javac --> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
       <verbose>true</verbose> 
       <fork>true</fork> 
       <executable>${JAVA_1_6_HOME}/bin/javac</executable> 
       <compilerVersion>1.3</compilerVersion> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

Se la vostra gli sviluppatori semplicemente aggiungono (e personalizzano) le seguenti linee nel loro settings.xml, il tuo pom sarà indipendente dalla piattaforma:

<settings> 
    [...] 
    <profiles> 
    [...] 
    <profile> 
     <id>compiler</id> 
     <properties> 
      <JAVA_1_4_HOME>C:\Program Files\Java\j2sdk1.4.2_09</JAVA_1_4_HOME> 
      <JAVA_1_6_HOME>C:\Program Files\Java\j2sdk1.6.0_18</JAVA_1_6_HOME> 
     </properties> 
    </profile> 
    </profiles> 
    [...] 
    <activeProfiles> 
    <activeProfile>compiler</activeProfile> 
    </activeProfiles> 
</settings> 
+11

Votato!Ho scoperto che posso usare '-Dmaven.compiler.fork = true' e' -Dmaven.compiler.executable =/path/to/target/javac' nella riga di comando. –

+0

anche usando java-opts, devi comunque aggiungerlo al plug-in del compilatore $ {maven.compiler.executable}

+1

@JinKwon Passare le opzioni con -D funziona bene, anche senza definirlo nella sezione del plugin del compilatore. Questo è utile per l'uso occasionale o per lo scripting. Dovresti metterlo in una risposta separata in modo che possiamo votare! –

0

ho avuto costruire problema con Maven all'interno di Eclipse su Windows 7.

Anche se ho osservato mvn accumulo stava funzionando bene da linea di comando.

mvn -T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml > output.log 

Eclipse stava prendendo in considerazione come predefinito JVM un'installazione di JRE, invece di JDK così è stato venendo a mancare sulla compilazione.

ho aggiunto al eclipse.ini seguente riga:

-vm 
C:\Program Files (x86)\Java\jdk1.8.0_25\bin 

anche quando si inizia da Eclipse che ho usato nel paragrafo "Obiettivi" seguente elenco:

-T 5 -B -e -X -U -P test clean install -Dmaven.surefire.debug --settings ..\..\infra-scripts\maven-conf\settings.xml 

errore di compilazione ottenuto risolto.

16

compile:compile ha a user property che consente di specificare un percorso per javac.

Si noti che questa proprietà utente funziona solo quando fork è true che è false per impostazione predefinita.

$ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/path/to/the/javac compile 

Potrebbe essere necessario raddoppiare il valore se contiene spazi.

> mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable="C:\...\javac" compile 

Vedere anche Maven custom properties precedence.

7

So che è un vecchio thread. Ma stavo avendo alcuni problemi con qualcosa di simile a questo in Maven per Java 8 fonte del compilatore. Ho capito questo con una soluzione rapida di cui this article pensato posso metterlo qui e forse può aiutare gli altri:

<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.8</maven.compiler.source> 
    <maven.compiler.target>1.8</maven.compiler.target> 
</properties> 
1

Per Java 9: ​​

<build> 
    <plugins> 
     <plugin> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.7.0</version> 
      <configuration> 
       <source>9</source> 
       <target>9</target> 
      </configuration> 
     </plugin> 
    </plugins> 
</build>