Specifica JDK per Maven da utilizzare


141

Sto cercando di creare un plug-in 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 poche menzioni su Internet ma non sembrano applicarsi a me. Alcuni suggeriscono di aggiungere un po 'di configurazione .m2/settings.xmlma non ne ho uno settings.xml. Inoltre, non voglio usare 1.6 per tutte le build di Maven.

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

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

Risposte:


142

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

Modifica temporaneamente il valore della JAVA_HOMEvariabile di ambiente.


10
Esempio in windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior,

6
in lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín

8
E nel caso in cui qualcun altro dimentichi e passi secoli chiedendosi perché non possono cambiarlo: JAVA_HOMEpuò essere impostato per Maven (almeno su Mac) in questo file: /private/etc/mavenrc - E che può usare qualcosa di simile (nota i backtick non le singole virgolette!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti,

3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(funziona per me)
Christophe Roussy

2
se cambio JAVA_HOME e poi lo faccio java -version, stampa ancora la versione precedente.
Ocramot,

82

Sembra che Maven ora fornisca una soluzione qui: compilare le fonti usando un JDK diverso

Diciamo il tuo JAVA_HOME punti su JDK7 (che eseguirà i processi Maven)

Potresti pom.xmlessere:

<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 i tuoi sviluppatori aggiungono (e personalizzano) le seguenti righe nella 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>

18
Votato! Ho scoperto che posso usare -Dmaven.compiler.fork=truee -Dmaven.compiler.executable=/path/to/target/javacnella riga di comando.
Jin Kwon,

anche usando quelle java-opts, è ancora necessario aggiungerlo al plug-in del compilatore <eseguibile> $ {maven.compiler.executable} </executable>
Paul Gregoire,

2
@JinKwon Passare le opzioni con -D funziona bene, anche senza definirlo nella sezione plugin del compilatore. Questo è utile per l'uso occasionale o per gli script. Dovresti inserirlo in una risposta separata in modo che possiamo votare!
Gaëtan Lehmann,

Questa soluzione non è riuscita quando ho provato a eseguire i test in Java 8 che stavo ottenendo * Non supportato major.minor versione 52.0 *
edwin,

39

compile: compile ha una proprietà utente che consente di specificare un percorso per il file javac.

Si noti che questa proprietà utente funziona solo quando forkè quella trueche è falsedi default.

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

Potrebbe essere necessario racchiudere tra virgolette il valore se contiene spazi.

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

Vedi anche Precedenza proprietà personalizzate Maven .


Ho anche dovuto sovrascrivere la mia JAVA_HOMEvariabile. Ad esempio (in shell bash):JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ mvn -Dmaven.compiler.fork=true -Dmaven.compiler.executable=/usr/lib/jvm/java-8-openjdk-amd64/bin/javac spring-boot:run
Enrique S. Filiage

24

Come hai detto "Inoltre, non voglio usare 1.6 per tutte le build di Maven." .... Quindi, meglio dire che modifica il tuo file pom e specifica quale versione jdk usare.

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

Garantirà che il tuo particolare progetto utilizzi quella versione di jdk.


6
Questo è solo il punto di partenza, ma non la soluzione. Questo è il requisito per il plug-in del compilatore Maven da compilare per 1.7. E poi il trucco è rendere Maven davvero in grado di compilare per 1.7, il che non è così banale se la tua attuale versione java è diversa ...
Sergey Ushakov,


14

Dico che hai impostato la JAVA_HOMEvariabile d'ambiente come sta dicendo Pascal: In Cygwin se usi bash come la tua shell dovrebbe essere:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Non è mai pericoloso anteporre anche il binpercorso della directory java alla PATHvariabile di ambiente con:

export PATH=${JAVA_HOME}/bin:${PATH}

Aggiungilo anche maven-enforce-pluginper assicurarti di usare il JDK giusto. 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>

Si prega di consultare il plugin Maven Enforcer - Utilizzo .


1
Questo era perfetto per specificare la versione esatta del JDK. Ad esempio, ho un progetto che fallisce quando si utilizza 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 fino a quando ho cambiato il mio percorso JAVA_HOME per indirizzare la cartella 1.8.0_77 specifica. Le altre risposte non ti hanno permesso di essere così granulare sulla versione.
Bojingo,

13

So che è un vecchio thread. Ma avevo dei problemi con qualcosa di simile a questo nel sorgente del compilatore Maven per Java 8. L'ho capito con una soluzione rapida menzionata in questo articolo, ho pensato di poterlo mettere qui e forse posso 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
Potrebbe essere necessario un aggiornamento Maven dopo aver aggiunto queste righe (Eclipse: tasto destro del mouse sul progetto, Maven, progetto di aggiornamento)
Romano

L'impostazione delle proprietà di maven.compiler non impedisce al codice di utilizzare i metodi aggiunti in java 11. Ad esempio String.repeat (). Questo quando si costruisce con jdk 11. Quindi la maven costruisce ma vorrei che fallisse
Enrico Giurin,

6

Maven utilizza la variabile $ JAVACMD come comando java finale, impostandolo su dove si trova l'eseguibile java cambierà Maven su JDK diverso.


Grazie amico, dopo aver trascorso 10 ore abbiamo risolto con l'aiuto della tua risposta.
Mukul_3062,

3

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


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

3

Se avete installato Java tramite brewin Macallora è probabile che troverete la vostra Java Home directory qui:

/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Il prossimo passo ora sarebbe trovare a quale Java Homedirectory sta puntando Maven. Per trovarlo digita il comando:
mvn -version

inserisci qui la descrizione dell'immagine

I campi a cui siamo interessati qui sono: Java versione runtime.

Maven sta puntando al momento Java 13. Inoltre, è possibile visualizzare il percorso principale Java sotto il runtime della chiave, ovvero:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Per modificare la versione Java di Maven, è necessario aggiungere il Java 8percorso principale alla JAVA_HOMEvariabile env.

Per fare ciò dobbiamo eseguire il comando:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home nel terminale.

Ora, se controlliamo la versione di Maven, possiamo vedere che ora punta a Java 8.

inserisci qui la descrizione dell'immagine

Il problema è che se si controlla di nuovo la versione di Maven nel nuovo terminale, si troverà che punta a Java 13. Per evitare ciò, suggerirei di aggiungere la JAVA_HOMEvariabile nel ~/.profilefile.

In questo modo, ogni volta che il tuo terminale sta caricando, assumerà il valore che hai definito in JAVA_HOME per impostazione predefinita. Questa è la riga che devi aggiungere nel ~/.profilefile:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Puoi aprire un nuovo terminale e controllare la versione di Maven, ( mvn -version) e scoprirai che punta a Java 8 questa volta.


0

Ho avuto problemi di costruzione con Maven all'interno di Eclipse su Windows 7.

Anche se ho osservato che mvn build funzionava perfettamente dalla riga 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 considerando come JVM predefinita un'installazione JRE anziché JDK, quindi non è riuscito durante la compilazione.

Ho aggiunto alla seguente riga eclipse.ini:

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

Inoltre, a partire da eclissi, ho usato il seguente elenco nella sezione "Obiettivi":

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

Errore di compilazione risolto.


0

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>

0

Un'altra alternativa per gestire più versioni jdk è jEnv

Dopo l'installazione, puoi semplicemente cambiare la versione java "localmente", ovvero per una directory di progetto specifica:

jenv local 1.6

Questo farà anche in modo che mvn usi quella versione localmente, quando si abilita il plugin mvn:

jenv enable-plugin maven

0

È inoltre possibile impostare JDK per Maven in un file nella directory home ~/.mavenrc:

JAVA_HOME='/Library/Java/JavaVirtualMachines/jdk-11.0.5.jdk/Contents/Home'

Questa variabile di ambiente verrà controllata dallo script mvn e utilizzata quando presente:

  if [ -f "$HOME/.mavenrc" ] ; then
    . "$HOME/.mavenrc"
  fi

https://github.com/CodeFX-org/mvn-java-9/tree/master/mavenrc

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.