Especifique o JDK para o Maven usar

141

Estou tentando criar um plugin do Hudson que modifiquei e requer o jdk1.6. Isso é bom, mas não vejo como posso dizer ao maven onde está o jdk diferente. Encontrei poucas menções na internet, mas elas não parecem se aplicar a mim. Alguns sugerem adicionar algumas configurações para, .m2/settings.xmlmas eu não tenho um settings.xml. Além disso, não quero usar o 1.6 para todas as compilações de maven.

Um problema é que estou usando o mvncygwin, se é que isso importa. Parece que eu devo ser capaz de fazer a especificação no arquivo pom do projeto, mas o pom existente é bastante simples.

Então, em suma, existe uma maneira de especificar um jdk para uma única invocação de maven?

DanInDC
fonte

Respostas:

142

Então, em suma, existe uma maneira de especificar um jdk para uma única invocação de maven?

Altere temporariamente o valor da sua JAVA_HOMEvariável de ambiente.

Pascal Thivent
fonte
10
Exemplo no windows:set JAVA_HOME="C:\Java\jdk7"
acdcjunior
6
no lubuntu: JAVA_HOME = "/ home / desa / programas / jdks / jdk1.6.0_45 /" mvn -v
Enrique San Martín
8
E no caso de alguém esquecer e passar anos se perguntando por que não pode alterá-lo: JAVA_HOMEpode ser definido para o Maven (no Mac pelo menos) neste arquivo: /private/etc/mavenrc - E isso pode usar algo como (observe as reticulares e não aspas 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 mim)
Christophe Roussy 2/16
2
se eu mudar JAVA_HOME e depois o fizer java -version, ele ainda imprimirá a versão anterior.
Ocramot 18/01/19
82

Parece que agora o maven fornece uma solução aqui: Compilando fontes usando um JDK diferente

Digamos que você JAVA_HOMEaponte para o JDK7 (que executará processos automatizados)

Você pom.xmlpode 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>

Se seus desenvolvedores apenas adicionarem (e personalizarem) as seguintes linhas settings.xml, o seu pom será independente da 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
fonte
18
Votado! Eu descobri que posso usar -Dmaven.compiler.fork=truee -Dmaven.compiler.executable=/path/to/target/javacna linha de comando.
Jin Kwon
mesmo usando esses java-opta, você ainda deve adicionar esta para o compilador de encaixe <executável> $ {maven.compiler.executable} </ executável>
Paul Gregoire
2
@JinKwon Passar opções com -D funciona bem, mesmo sem defini-lo na seção de plug-in do compilador. Isso é bom para uso ocasional ou para scripts. Você deve colocá-lo em uma resposta separada para que possamos votar!
Gaëtan Lehmann
Esta solução falhou ao tentar executar testes no Java 8 que eu estava recebendo * Major.minor não suportado, versão 52.0 * *
edwin
39

compilar: compilar possui uma propriedade de usuário que permite especificar um caminho para o arquivo javac.

Observe que essa propriedade do usuário funciona apenas quando forké o trueque é falsepor padrão.

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

Pode ser necessário citar duas vezes o valor se ele contiver espaços.

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

Consulte também precedência de propriedades personalizadas do Maven .

Jin Kwon
fonte
Eu também precisei sobrescrever minha JAVA_HOMEvariável. Por exemplo (no 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

Como você disse: "Além disso, não quero usar o 1.6 para todas as compilações do maven." .... Então, melhor dizer: modifique seu arquivo pom e especifique qual versão do 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>

Isso garantirá que seu projeto específico use essa versão do jdk.

DevCoder
fonte
6
Este é apenas o ponto de partida, mas não a solução. Este é o requisito para o plug-in do compilador maven compilar para 1.7. E então o truque é fazer maven realmente capaz de compilar para 1,7, o que não é tão trivial se a sua versão atual java é diferente ...
Sergey Ushakov
Essa é outra questão: stackoverflow.com/questions/16723533/… #
9786 Paul Verest
14

Eu digo que você configura a JAVA_HOMEvariável de ambiente como Pascal está dizendo: No Cygwin, se você usar o bash, como seu shell deve ser:

export JAVA_HOME=/cygdrive/c/pathtothejdk

Nunca é prejudicial também acrescentar o bincaminho do diretório java à PATHvariável de ambiente com:

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

Adicione também maven-enforce-pluginpara garantir que o JDK correto seja usado. Esta é uma boa prática para o seu 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, consulte o plugin Maven Enforcer - Uso .

feniix
fonte
1
Isso foi perfeito para especificar a versão exata do JDK. Por exemplo, eu tenho um projeto que falha ao usar o JDK 1.8 inicial, mas se estiver usando o JDK 1.8.0_77, ele funcionará perfeitamente. Eu tinha os dois JDKs instalados e, com essa solução, o maven me disse que estava usando a versão errada do 1.8 até alterar meu caminho JAVA_HOME para atingir a pasta 1.8.0_77 específica. As outras respostas não permitiram que você fosse tão granular na versão.
bojingo
13

Eu sei que é um tópico antigo. Mas eu estava tendo alguns problemas com algo semelhante a isso na fonte do compilador Maven for Java 8. Eu descobri isso com uma solução rápida mencionada neste artigo, pensei que posso colocá-lo aqui e talvez possa ajudar outras pessoas:

<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
fonte
1
Uma atualização do Maven pode ser necessária após a adição dessas linhas (Eclipse: Clique com o botão direito do mouse no projeto, Maven, Atualizar projeto)
Romano
A configuração das propriedades do maven.compiler não impede que o código use os métodos adicionados no java 11. Nas instâncias String.repeat (). Isto quando a construção com jdk 11. Assim, o Maven constrói mas eu gostaria que seria um fracasso
Enrico Giurin
6

O Maven usa a variável $ JAVACMD como o comando java final, defina-o como o executável java, mudará para outro JDK.

Lin Gao
fonte
Obrigado amigo, depois de passar 10 horas, corrigimos com a ajuda de sua resposta.
Mukul_3062 21/02/19
3

O Hudson também permite definir vários tempos de execução do Java e chamar o Maven com um deles. Dê uma olhada na página de configuração.

Thorbjørn Ravn Andersen
fonte
O OP está criando um plugin hudson na linha de comando, não no hudson (pelo menos, este é o meu entendimento).
Pascal Thivent 23/03
3

Se você tiver instalado o Java através brewem Macseguida, as chances são que você vai encontrar o seu inicialAnuário Java aqui:

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

O próximo passo agora seria encontrar para qual Java Homediretório o maven está apontando. Para encontrá-lo, digite o comando:
mvn -version

insira a descrição da imagem aqui

Os campos em que estamos interessados ​​aqui são: Java versione runtime.

Maven está atualmente apontando para Java 13. Além disso, você pode ver o caminho do Java Home sob o tempo de execução da chave, que é:
/usr/local/Cellar/openjdk/13.0.2+8_2/libexec/openjdk.jdk/Contents/Home

Para alterar a versão Java do maven, precisamos adicionar o Java 8caminho inicial à JAVA_HOMEvariável env.

Para fazer isso, precisamos executar o comando:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home no terminal.

Agora, se verificarmos a versão maven, podemos ver que ela está apontando para o Java 8 agora.

insira a descrição da imagem aqui

O problema é que, se você verificar a versão maven novamente no novo terminal, verá que ela está apontando para o Java 13. Para evitar isso, sugiro adicionar a JAVA_HOMEvariável no ~/.profilearquivo.

Dessa forma, sempre que seu terminal estiver carregando, ele assumirá o valor que você definiu no JAVA_HOME por padrão. Esta é a linha que você precisa adicionar no ~/.profilearquivo:
export JAVA_HOME=/Library/Java/JavaVirtualMachines/adoptopenjdk-8.jdk/Contents/Home

Você pode abrir um novo terminal e verificar a versão do Maven, ( mvn -version) e verá que está apontando para o Java 8 desta vez.

Rito
fonte
0

Eu tive problema de compilação com o maven no Eclipse no Windows 7.

Embora eu tenha observado o mvn build estava funcionando muito bem na linha de comando.

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

O Eclipse estava considerando como JVM padrão uma instalação do JRE em vez do JDK, portanto estava com falha na compilação.

Eu adicionei ao eclipse.ini a seguinte linha:

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

Além disso, ao iniciar no eclipse, usei na seção "Objetivos" a seguir:

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

O erro de compilação foi resolvido.

aprodan
fonte
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
fonte
0

Outra alternativa para gerenciar várias versões do jdk é o jEnv

Após a instalação, você pode simplesmente alterar a versão java "localmente", ou seja, para um diretório de projeto específico:

jenv local 1.6

Isso também fará com que o mvn use essa versão localmente, quando você ativar o plugin mvn:

jenv enable-plugin maven
Ahmad Abdelghany
fonte
0

Você também pode definir o JDK for Maven em um arquivo no diretório inicial ~/.mavenrc:

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

Essa variável de ambiente será verificada pelo script mvn e usada quando presente:

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

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

Spindizzy
fonte