Cómo configurar una versión específica de Java para Maven

162

En mi máquina tengo instaladas dos versiones de Java: (1.6 y 1.7 instaladas manualmente por mí). Los necesito a ambos para diferentes proyectos. Pero para Maven necesito 1.7, ahora mi Maven usa la versión 1.6 java, ¿cómo puedo configurar Maven para que use 1.7?

y Pat
fuente
No puedo exportar JAVA_HOME con java 1.7 porque no puedo tocar la configuración de mi máquina, la versión predeterminada de Java debe ser 1.6.
y el
Maven usa JAVA_HOME, así que no pienses que lo que quieres hacer es posible sin cambiar el valor de JAVA_HOME.
Zyga
1
¿Estás usando un IDE o la línea de comando? ¿Estás en un * nix o windows?
xwoker
1
¿Esta respuesta cubre lo que quieres? stackoverflow.com/a/4724062/1570834
DB5
Sí es útil, pero no puedo hacer cambios en el proyecto, sin embargo, las cosas son las mismas y la respuesta es correcta
y el

Respuestas:

137

Maven usa el JAVA_HOMEparámetro para encontrar qué versión de Java se supone que debe ejecutar. Veo por su comentario que no puede cambiar eso en la configuración.

  • Puede configurar el JAVA_HOMEparámetro justo antes de iniciar maven (y cambiarlo nuevamente si es necesario).
  • También puede ir a su mvn(no Windows) / mvn.bat/ mvn.cmd(Windows) y configurar su versión de Java explícitamente allí.
DanielBarbarian
fuente
29
@andPat: ¿y? Puede configurar JAVA_HOMEsu shell local sin cambiar la configuración de su máquina (tan pronto como cierre ese shell, el cambio desaparecerá). Incluso puede cambiarlo por un solo comando:JAVA_HOME=/path/to/jdk17/ mvn build
Joachim Sauer
@JoachimSauer: Sí, pero también hice referencia a mvn.bat, que es específico de Windows.
DanielBarbarian
En Mac puedes crear un archivo .mavenrc con el JAVA_HOME dentro
Ronan Quillevere
Viejo, pero tirando mis 2 centavos. Estoy trabajando en un servicio Java 8 llamado por una aplicación Java 7. Para evitar tener que cambiar constantemente al construir, yo (en Windows) creé una variable de entorno MVN_JAVA_HOME, y luego reemplacé cada aparición de JAVA_HOME con MVN_JAVA_HOME dentro de mvn y mvn.cmd.
ryanlutgen
74

En el POM, puede establecer las propiedades del compilador, por ejemplo, para 1.8:

<project>
...
 <properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
...
</project>
Edward Ross
fuente
9
A partir del compilador-plugin versión 3.7.0, los valores por defecto de origen y de destino si se deja sin especificar es de 1,5
Crowne
58

Agregar una solución para personas con múltiples versiones de Java instaladas

Tenemos una gran base de código, la mayoría de los cuales está en Java. La mayoría de lo que trabajo está escrito en Java 1.7 o 1.8. Como JAVA_HOMEes estático, creé alias en mi .bashrcpara ejecutar Maven con diferentes valores:

alias mvn5="JAVA_HOME=/usr/local/java5 && mvn"
alias mvn6="JAVA_HOME=/usr/local/java6 && mvn"
alias mvn7="JAVA_HOME=/usr/local/java7 && mvn"
alias mvn8="JAVA_HOME=/usr/local/java8 && mvn"

Esto me permite ejecutar Maven desde la línea de comandos en mi máquina de desarrollo, independientemente de la versión JDK utilizada en el proyecto.

Jonathan Landrum
fuente
2
A menos que necesite maven 2 y 3 para varios proyectos, en cuyo caso ya tiene mvn2y mvn3definido y el nombre se vuelve un poco extraño cuando las versiones de Java también entran en juego ...: D
Tomislav Nakic-Alfirevic
3
Si está utilizando una Mac, su JDK viene con el comando java_home para que pueda evitar rutas de codificación, por ejemploalias mvn8 = "JAVA_HOME=`/usr/libexec/java_home -v 1.8` && mvn
ptkvsk
55
En (ubuntu + bash), debe omitir el &&anterior mvn. mvn no ve el valor de JAVA_HOME con &&.
Fabien
@Fabien es bueno saberlo; Uso ZSH y no sabía sobre las diferencias de Bash
Jonathan Landrum
47

En windows

Si no desea cambiar su JAVA_HOMEvariable dentro de las variables del sistema.

Edite su mvn.batarchivo y agregue una línea como esta

set JAVA_HOME=C:\Program Files\Java\jdk1.7.0_45\jre

Esto se puede hacer después de lo @REM ==== START VALIDATION ====mencionado por @Jonathan

En Mac (¿y Linux?)

Si no desea cambiar su JAVA_HOMEvariable dentro de su ~/.bashrco~/.bash_profile

se puede crear un ~/.mavenrcarchivo y volver a definir su JAVA_HOMEuso de la herramienta de inicio_java

export JAVA_HOME=`/usr/libexec/java_home -v 1.7.0_45`

Prueba de cordura

Puede verificar que todo funcione bien ejecutando los siguientes comandos. La versión jdk debería ser diferente.

mvn -version

luego

java -version

Ronan Quillevere
fuente
Lo configuré para establecer JAVA_HOME = C: \ Archivos de programa \ Java \ jdk1.7.0_45 sublimada jre sublimada.
nanosoft
32

Agregar mis dos centavos y proporcionar explícitamente la solución.

Tengo dos JDK instalados en mi máquina con Windows, JDK 1.5y JDK 1.6.

Mi valor predeterminado (y configurado en la variable de entorno del sistema de Windows) JAVA_HOMEestá configurado en JDK 1.5.

Sin embargo, tengo un proyecto maven que necesito construir (es decir, Etsy.com de JBehave Tutorial ) usando JDK 1.6.

Mi solución en este escenario (¡que funcionó!), Es la sugerida por @DanielBarbarianconfigurarlo mvn.bat.

Para algunos que no están familiarizados con el archivo por lotes de Windows, básicamente agregué la set JAVA_HOME=<path_to_other_jdk>línea después @REM ==== START VALIDATION ====de mvn.bat(es decir, %MAVEN_HOME%\bin\mvn.bat):

@REM ==== START VALIDATION ====
set JAVA_HOME=C:\Program Files\Java\jdk1.6.0_45\jre
if not "%JAVA_HOME%" == "" goto OkJHome
Jonathan
fuente
44
En maven 3.5, mvn.batse renombra a mvn.cmd.
CKM
30

Hace poco, después de siete largos años con Maven, aprendí sobre toolchains.xml. Maven lo tiene incluso documentado y lo admite desde 2.0.9 - documentación de toolchains

Así que agregué un archivo toolchain.xml a mi carpeta ~ / .m2 / con el siguiente contenido:

<toolchains xmlns="http://maven.apache.org/TOOLCHAINS/1.1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/TOOLCHAINS/1.1.0 http://maven.apache.org/xsd/toolchains-1.1.0.xsd">
 <!-- JDK toolchains -->
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.8</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java8</jdkHome>
   </configuration>
 </toolchain>
 <toolchain>
   <type>jdk</type>
   <provides>
     <version>1.7</version>
     <vendor>sun</vendor>
   </provides>
   <configuration>
     <jdkHome>/opt/java7</jdkHome>
   </configuration>
 </toolchain>
</toolchains>

Le permite definir qué diferentes JDKs Maven puede usar para construir el proyecto, independientemente de con qué JDK Maven se ejecute. Algo así como cuando define JDK a nivel de proyecto en IDE.

Ondrej Burkert
fuente
2
La mejor respuesta! Gracias. Esto explica una situación clara en la que queremos ejecutar Maven y el proyecto en compilación con dos java runtimes / framework diferentes.
Soundararajan
5

Una solución simple al problema:

JAVA_HOME = / usr / lib / jvm / java-6-sun / mvn instalación limpia

En Mac, se vería algo así como:

JAVA_HOME = / Library / Java / JavaVirtualMachines / jdk1.7.0_21.jdk / Contents / Home / mvn clean install

PD: Un caso especial que encontré es que el comando dado anteriormente no funciona en el shell 'fish'. También tenía bash shell disponible y funcionó bien allí. solo use el comando 'bash' para cambiar a bash shell.

Pankaj
fuente
5

Puede configurar fuentes de compilación utilizando diferentes JDK con maven-compiler-plugin.

Simplemente especifique la ruta a javacen la <executable>etiqueta. Por ejemplo, para java11 se ve así:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <source>11</source>
        <target>11</target>
        <fork>true</fork>
        <executable>C:\Program Files\Java\jdk-11.0.1\bin\javac</executable> <!--PATH TO JAVAC -->
    </configuration>
</plugin>
Ruslan
fuente
4

Para evitar cualquier impacto en su proyecto y en sus Variables de entorno, puede configurar el complemento del compilador Maven solo para el POM del proyecto, especificando la versión Java de origen y destino

  <plugins>
    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.5.1</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>
    ...
  </plugins>
Tonino
fuente
4

Puede configurar Maven para usar cualquier versión de Java siguiendo las instrucciones a continuación.

Instale jenv en el enlace de su máquina

Verifique las versiones disponibles de Java instaladas en su máquina emitiendo el siguiente comando en la línea de comandos.

versiones de jenv

Puede especificar la versión global de Java con el siguiente comando.

jenv global oracle64-1.6.0.39

Puede especificar la versión local de Java para cualquier directorio (Proyecto) utilizando el siguiente comando en el directorio en la línea de comandos.

jenv local oracle64-1.7.0.11

agregue la versión correcta de Java en su pom.xml

si está ejecutando maven en la línea de comandos, instale el complemento jenv maven utilizando el siguiente comando

jenv enable-plugin maven

Ahora puede configurar cualquier versión de Java en su máquina para cualquier proyecto sin ningún problema.

Ranuka
fuente
1
como esta opción jenv es como virtualenv para python
Jesse Zhuang
4

En Mac, (suponiendo que tenga instalada la versión correcta)

JAVA_HOME=`/usr/libexec/java_home -v 1.8` mvn clean install -DskipTests

usuario2475448
fuente
4

Sin cambiar las Variables de entorno, puede administrar la versión de Java en función del nivel del proyecto utilizando el Complemento del compilador de Maven.

Método 1

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Método 2

<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>
Saveendra Ekanayake
fuente
2

En Windows, solo agrego varios archivos por lotes para diferentes versiones de JDK a la carpeta bin de Maven de esta manera:

mvn11.cmd

@echo off
setlocal
set "JAVA_HOME=path\to\jdk11"
set "path=%JAVA_HOME%;%path%"
mvn %*

entonces puede usar mvn11para ejecutar Maven en el JDK especificado.

Guo Ferrell
fuente
1

No tuve éxito en mac con solo configurar JAVA_HOMEen la consola, pero tuve éxito con este enfoque

  • Cree el archivo .mavenrc en su directorio de inicio (para que la ruta del archivo sea ~/.mavenrc
  • En ese archivo pegue export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
Martin Vich
fuente
0

También puede tener instaladas dos versiones de maven y editar una de ellas, editando aquí:

mvn (no windows) /mvn.bat/mvn.cmd (windows)

reemplazando sus% java_home% apariencias a su ruta deseada de java. Luego solo ejecuta maven desde esa ruta modificada

Alberto Perez
fuente