Especifique JDK para que Maven lo use

141

Estoy tratando de construir un plugin Hudson que he modificado y requiere jdk1.6. Esto está bien, pero no veo cómo puedo decirle a Maven dónde está el jdk diferente. Encontré pocas menciones en Internet, pero no parecen aplicarse a mí. Algunos sugieren agregar algo de configuración .m2/settings.xmlpero no tengo un settings.xml. Además, no quiero usar 1.6 para todas las compilaciones de Maven.

Un inconveniente es que estoy usando mvnen Cygwin, si eso es importante. Parece que debería poder hacer la especificación en el archivo pom del proyecto, pero el pom existente es bastante simple.

Entonces, en resumen, ¿hay alguna manera de especificar un jdk para una sola invocación de maven?

DanInDC
fuente

Respuestas:

142

Entonces, en resumen, ¿hay alguna manera de especificar un jdk para una sola invocación de maven?

Cambie temporalmente el valor de su JAVA_HOMEvariable de entorno.

Pascal Thivent
fuente
10
Ejemplo en windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior
66
en lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín
8
Y en caso de que alguien más se olvide y pase años preguntándose por qué no pueden cambiarlo: JAVA_HOMEse puede configurar para Maven (al menos en Mac) en este archivo: /private/etc/mavenrc - Y eso puede usar algo como (¡tenga en cuenta las comillas no comillas simples!):export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_75`
RedYeti
3
Unix: export JAVA_HOME='D:/dev/java/jdk8/jre'(funciona para mí)
Christophe Roussy
2
si cambio JAVA_HOME y luego lo hago java -version, todavía imprime la versión anterior.
ocramot
82

Parece que Maven ahora da una solución aquí: compilar fuentes usando un JDK diferente

Digamos sus JAVA_HOMEpuntos a JDK7 (que ejecutará procesos maven)

Tu pom.xmlpodría ser:

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

Si sus desarrolladores simplemente agregan (y personalizan) las siguientes líneas en su settings.xml, su pom será independiente de la plataforma:

<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>
Cerber
fuente
18
¡Votado! Encontré que puedo usar -Dmaven.compiler.fork=truey -Dmaven.compiler.executable=/path/to/target/javacen la línea de comandos.
Jin Kwon
incluso usando esos java-opts, aún debe agregar esto al complemento del compilador <executable> $ {maven.compiler.executable} </executable>
Paul Gregoire
2
@JinKwon Las opciones de paso con -D funcionan bien, incluso sin definirlo en la sección del complemento del compilador. Esto es bueno para uso ocasional o para secuencias de comandos. ¡Debería ponerlo en una respuesta separada para que podamos votarlo!
Gaëtan Lehmann
Esta solución falló cuando intento ejecutar pruebas en Java 8 que estaba obteniendo * Versión de major.minor 52.0 * no compatible
edwin
39

compilar: compilar tiene una propiedad de usuario que le permite especificar una ruta al javac.

Tenga en cuenta que esta propiedad de usuario solo funciona cuando forkes lo trueque es falsepor defecto.

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

Es posible que tenga que doble comillas el valor si contiene espacios.

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

Consulte también la precedencia de las propiedades personalizadas de Maven .

Jin Kwon
fuente
También he necesitado sobrescribir mi JAVA_HOMEvariable. Por ejemplo (en bash shell):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

Como dijiste "Además, no quiero usar 1.6 para todas las compilaciones de Maven" ... Así que mejor diré que modifiques tu archivo pom y especifiques qué versión jdk usar.

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

Se asegurará de que su proyecto particular use esa versión de jdk.

DevCoder
fuente
66
Este es solo el punto de partida, pero no la solución. Este es el requisito para que el complemento compilador maven compile para 1.7. Y luego el truco es hacer que Maven sea realmente capaz de compilar para 1.7, lo que no es tan trivial si su versión actual de Java es diferente ...
Sergey Ushakov
Esa es otra pregunta stackoverflow.com/questions/16723533/…
Paul Verest
14

Digo que configure la JAVA_HOMEvariable de entorno como dice Pascal: en Cygwin si usa bash como su shell debería ser:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Nunca perjudica también anteponer la binruta del directorio de Java a la PATHvariable de entorno con:

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

Agregue también maven-enforce-pluginpara asegurarse de que se utiliza el JDK correcto. Esta es una buena práctica para tu 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>

Por favor, vea el complemento Maven Enforcer - Uso .

feniix
fuente
1
Esto fue perfecto para especificar la versión exacta del JDK. Por ejemplo, tengo un proyecto que falla cuando uso el JDK 1.8 inicial, pero si uso JDK 1.8.0_77, funciona bien. Tenía ambos JDK instalados, y con esta solución, Maven me dijo que estaba usando la versión incorrecta de 1.8 hasta que cambié mi ruta JAVA_HOME para apuntar a la carpeta específica 1.8.0_77. Las otras respuestas no le permitieron ser tan granular en la versión.
bojingo
13

Sé que es un hilo viejo. Pero estaba teniendo algunos problemas con algo similar a esto en la fuente del compilador Maven para Java 8. Resolví esto con una solución rápida mencionada en este artículo, pensé que podía ponerlo aquí y quizás ayudar a otros:

<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>
Parth Joshi
fuente
1
Es posible que se requiera una actualización de Maven después de agregar estas líneas (Eclipse: clic derecho en el proyecto, Maven, proyecto de actualización)
Romano
Establecer las propiedades de maven.compiler no impide que el código use métodos agregados en java 11. Por ejemplo, String.repeat (). Esto cuando se construye con jdk 11. Entonces el experto construye pero desearía que fallara
Enrico Giurin
6

Maven usa la variable $ JAVACMD como el comando final de Java, configúrelo donde el ejecutable de Java cambiará Maven a diferentes JDK.

Lin Gao
fuente
Gracias amigo, después de pasar 10 horas lo arreglamos con la ayuda de su respuesta.
Mukul_3062
3

Hudson también le permite definir varios tiempos de ejecución de Java y le permite invocar a Maven con uno de estos. Eche un vistazo más de cerca a la página de configuración.

Thorbjørn Ravn Andersen
fuente
El OP está construyendo un complemento hudson en la línea de comando, no debajo de hudson (al menos, según tengo entendido).
Pascal Thivent
3

Si ha instalado Java a través brewde Macentonces es probable que usted encontrará en el directorio básico de Java aquí:

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

El siguiente paso ahora sería encontrar a qué Java Homedirectorio apunta Maven. Para encontrarlo, escriba el comando:
mvn -version

ingrese la descripción de la imagen aquí

Los campos que nos interesan aquí son: Java versiony runtime.

Maven está apuntando actualmente Java 13. Además, puede ver la ruta de inicio de Java bajo el tiempo de ejecución de la clave, que es:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Para cambiar la versión Java de Maven, necesitamos agregar la Java 8ruta de inicio a la JAVA_HOMEvariable env.

Para hacer eso necesitamos ejecutar el comando:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home en la terminal.

Ahora, si comprobamos la versión de Maven, podemos ver que ahora apunta a Java 8.

ingrese la descripción de la imagen aquí

El problema con esto es que si verifica la versión de Maven nuevamente en el nuevo terminal, encontrará que apunta a Java 13. Para evitar esto, sugeriría agregar la JAVA_HOMEvariable en el ~/.profilearchivo.

De esta manera, cada vez que se cargue su terminal, tomará el valor que definió en JAVA_HOME de forma predeterminada. Esta es la línea que necesita agregar en el ~/.profilearchivo:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Puede abrir un nuevo terminal y verificar la versión de Maven, ( mvn -version) y encontrará que esta vez apunta a Java 8.

Rito
fuente
0

Tuve un problema de compilación con maven dentro de Eclipse en Windows 7.

Aunque observé que mvn build funcionaba bien desde la línea de comandos.

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

Eclipse estaba considerando como JVM predeterminado una instalación JRE en lugar de JDK, por lo que no se pudo compilar.

Agregué a eclipse.ini la siguiente línea:

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

También cuando comencé con el eclipse, utilicé en la sección "Objetivos" la siguiente lista:

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

Se solucionó el error de compilación.

aprodan
fuente
0

Para 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>
Jobanpreet Singh
fuente
0

Otra alternativa más para administrar múltiples versiones de jdk es jEnv

Después de la instalación, simplemente puede cambiar la versión de Java "localmente", es decir, para un directorio de proyecto específico:

jenv local 1.6

Esto también hará que mvn use esa versión localmente, cuando habilite el complemento mvn:

jenv enable-plugin maven
Ahmad Abdelghany
fuente
0

También puede configurar el JDK para Maven en un archivo en su directorio de inicio ~/.mavenrc:

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

El script mvn verificará esta variable de entorno y se usará cuando esté presente:

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

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

Spindizzy
fuente