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?

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.


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>

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 .


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.


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


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 .


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>

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.


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.


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.


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.


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>

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.