Como definir uma versão java específica para o Maven

162

Na minha máquina, tenho duas versões java instaladas: (1.6 e 1.7 instaladas manualmente por mim). Preciso dos dois para projetos diferentes. Mas para o Maven eu preciso do 1.7, agora o meu Maven usa a versão 1,6 java, como posso configurar o Maven para usar o 1,7?

andPat
fonte
Não consigo exportar JAVA_HOME com o java 1.7 porque não consigo tocar na configuração da minha máquina, a versão padrão do Java deve ser 1.6.
andPat
O Maven usa JAVA_HOME, então não pense que o que você quer fazer é possível sem alterar o valor JAVA_HOME.
Zyga #
1
Você está usando um IDE ou a linha de comando? Você está em um * nix ou windows?
Xwoker 29/10
1
Esta resposta cobre o que você deseja? stackoverflow.com/a/4724062/1570834
DB5 29/10
Sim é útil, mas eu não posso fazer chnges para pom do projeto, no entanto, o material é o mesmo e resposta está correta
andPat

Respostas:

137

O Maven usa o JAVA_HOMEparâmetro para encontrar qual versão do Java ele deve executar. Vejo no seu comentário que você não pode mudar isso na configuração.

  • Você pode definir o JAVA_HOMEparâmetro imediatamente antes de iniciar o maven (e alterá-lo novamente, se necessário).
  • Você também pode acessar o mvn(não-windows) / mvn.bat/ mvn.cmd(windows) e definir explicitamente a sua versão java.
DanielBarbarian
fonte
29
@andPat: então? Você pode definir JAVA_HOMEseu shell local sem alterar a configuração da sua máquina (assim que você fechar esse shell, a alteração será concluída). Você pode até alterá-lo para um único comando:JAVA_HOME=/path/to/jdk17/ mvn build
Joachim Sauer
@JoachimSauer: Sim, mas eu também fiz uma referência ao mvn.bat, que é específico do Windows.
DanielBarbarian
No mac, você pode criar um arquivo .mavenrc com o JAVA_HOME dentro #
Ronan Quillevere
Velho, mas jogando em meus 2 centavos. Estou trabalhando em um serviço Java 8 chamado por um aplicativo Java 7. Para evitar ter que alternar constantemente durante a construção, eu (no Windows) criei uma variável de ambiente MVN_JAVA_HOME e substitui todas as ocorrências de JAVA_HOME por MVN_JAVA_HOME dentro de mvn e mvn.cmd.
Ryanlutgen
74

No POM, você pode definir as propriedades do compilador, por exemplo, 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
fonte
9
A partir de-plugin compilador versão 3.7.0, os valores padrão para origem e de destino, se deixados não especificado é de 1,5
Crowne
58

Adicionando uma solução para pessoas com várias versões Java instaladas

Temos uma grande base de código, a maioria em Java. A maioria do que eu trabalho é escrita em Java 1.7 ou 1.8. Como JAVA_HOMEé estático, criei alias no meu .bashrcpara executar o Maven com valores diferentes:

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"

Isso permite que eu execute o Maven na linha de comando da minha máquina de desenvolvimento, independentemente da versão do JDK usada no projeto.

Jonathan Landrum
fonte
2
A menos que você precise do maven 2 e 3 para vários projetos, nesse caso, você já tem mvn2e mvn3definiu e a nomeação fica um pouco estranha quando as versões Java também entram em jogo ...: D
Tomislav Nakic-Alfirevic
3
Se você estiver usando um Mac, o seu JDK vem com java_home comando para que você possa evitar caminhos codificar, por exemploalias mvn8 = "JAVA_HOME=`/usr/libexec/java_home -v 1.8` && mvn
ptkvsk
5
No (ubuntu + bash), você deve omitir o &&antes mvn. mvn não vê o valor de JAVA_HOME com &&.
Fabien
@Fabien bom saber; Eu uso ZSH e não sabia sobre as diferenças Bash
Jonathan Landrum
47

No windows

Se você não deseja alterar sua JAVA_HOMEvariável dentro das variáveis ​​do sistema.

Edite seu mvn.batarquivo e adicione uma linha como esta

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

Isso pode ser feito depois, @REM ==== START VALIDATION ====como mencionado por @ Jonathan.

No Mac (e Linux?)

Se você não deseja alterar sua JAVA_HOMEvariável dentro de ~/.bashrcou~/.bash_profile

você pode criar um ~/.mavenrcarquivo e redefinir seu JAVA_HOMEusando a ferramenta java_home

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

Verificação de sanidade

Você pode verificar se tudo está funcionando bem executando os seguintes comandos. A versão do jdk deve ser diferente.

mvn -version

então

java -version

Ronan Quillevere
fonte
Eu o defino para definir a subpasta jre excluída JAVA_HOME = C: \ Arquivos de Programas \ Java \ jdk1.7.0_45.
Nanosoft 25/01/16
32

Adicionando meus dois centavos e explicitamente fornecendo a solução.

Eu tenho dois JDKs instalados na minha máquina Windows - JDK 1.5e JDK 1.6.

Meu padrão (e definido como variável de ambiente do sistema Windows) JAVA_HOMEestá definido como JDK 1.5.

No entanto, eu tenho um projeto que eu preciso construir (por exemplo, o Etsy.com do JBehave Tutorial ) usando JDK 1.6.

Minha solução neste cenário (que funcionou!) É a sugerida @DanielBarbarianpara configurá-lo mvn.bat.

Para alguns que não estão familiarizados com o arquivo em lotes da janela, basicamente adicionei a set JAVA_HOME=<path_to_other_jdk>linha depois @REM ==== START VALIDATION ====de mvn.bat(ou seja %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
fonte
4
No maven 3.5, mvn.baté renomeado para mvn.cmd.
CKM
30

Recentemente, depois de sete longos anos com o Maven, aprendi sobre o toolchains.xml. O Maven ainda o documenta e suporta a partir do 2.0.9 - toolchains documentation

Então, adicionei um arquivo toolchain.xml à minha pasta ~ / .m2 / com o seguinte conteúdo:

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

Ele permite definir quais JDKs Maven diferentes podem usar para criar o projeto, independentemente do JDK Maven ser executado. É como quando você define o JDK no nível do projeto no IDE.

Ondrej Burkert
fonte
2
A melhor resposta! Obrigado. Isso explica uma situação clara em que queremos executar o Maven e o projeto em compilação com dois tempos / durações de Java diferentes.
Soundararajan
5

Uma solução simples para o problema -

JAVA_HOME = / usr / lib / jvm / java-6-sun / mvn instalação limpa

No Mac, seria algo como -

JAVA_HOME = / Biblioteca / Java / JavaVirtualMachines / jdk1.7.0_21.jdk / Conteúdo / Home / instalação limpa do mvn

PS: Um caso especial que eu encontrei é o comando acima, dado que não funciona no shell 'fish'. Eu também tinha o shell bash disponível e funcionou bem lá. basta usar o comando 'bash' para alternar para o bash shell.

Pankaj
fonte
5

Você pode configurar fontes de compilação usando JDK diferente com maven-compiler-plugin.

Basta especificar o caminho para javacna <executable>tag. Por exemplo, para java11, ele se parece com:

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

Para evitar qualquer impacto no seu projeto e nas variáveis ​​de ambiente, você pode configurar o plug-in do Maven Compiler apenas no POM do projeto, especificando a versão java de origem e 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
fonte
4

Você pode configurar o Maven para usar qualquer versão java seguindo as instruções abaixo.

Instale o jenv no link da sua máquina

Verifique as versões java disponíveis instaladas em sua máquina emitindo o seguinte comando na linha de comando.

versões jenv

Você pode especificar a versão global do Java usando o seguinte comando.

jenv global oracle64-1.6.0.39

Você pode especificar a versão Java local para qualquer diretório (Projeto) usando o seguinte comando no diretório na linha de comandos.

jenv local oracle64-1.7.0.11

adicione a versão java correta no seu pom.xml

Se você estiver executando o maven na linha de comando, instale o plugin jenv maven usando o comando abaixo

jenv enable-plugin maven

Agora você pode configurar qualquer versão java em sua máquina para qualquer projeto sem problemas.

Ranuka
fonte
1
como esta opção. jenv é como virtualenv para python
Jesse Zhuang
4

Em Macs, (supondo que você tenha a versão correta instalada)

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

user2475448
fonte
4

Sem alterar as variáveis ​​de ambiente, você pode gerenciar a versão java com base no nível do projeto usando o Maven Compiler Plugin.

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

No Windows, apenas adiciono vários arquivos em lotes para diferentes versões do JDK à pasta bin Maven, como esta:

mvn11.cmd

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

então você pode usar mvn11para executar o Maven no JDK especificado.

Guo Ferrell
fonte
1

Não tive sucesso no mac com apenas a configuração JAVA_HOMEno console, mas fui bem-sucedido com essa abordagem

  • Crie o arquivo .mavenrc no seu diretório pessoal (para que o caminho do arquivo seja ~/.mavenrc
  • Na pasta desse arquivo export JAVA_HOME=$(/usr/libexec/java_home -v 1.7)
Martin Vich
fonte
0

Além disso, você pode ter duas versões do maven instaladas e editar uma delas, editando aqui:

mvn (não janelas) /mvn.bat/mvn.cmd (windows)

substituindo as aparências de% java_home% pelo caminho desejado em java. Em seguida, basta executar o maven a partir desse caminho modificado

Alberto Perez
fonte