Compilando código Java 7 via Maven

155

Minhas listas de arquivos pom

<project>
  <build>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.12.4</version>
            </plugin>
        </plugins>
    </pluginManagement>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
            </configuration>
        </plugin>
    </plugins>
  ...

No entanto mvn clean install, eu recebo

[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR : 
[INFO] -------------------------------------------------------------
[ERROR] Failure executing javac, but could not parse the error:
javac: invalid target release: 1.7
Usage: javac <options> <source files>

/usr/bin/java -versioné ( which javaaponta aqui)

java version "1.7.0_10"
Java(TM) SE Runtime Environment (build 1.7.0_10-b18)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)

javac também aponta para a versão correta do Java

/usr/bin/javac -> /Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home/bin/javac

Nesta máquina, estou usando zsh( echo $0retorna -zsh)

No meu .zshrc, eu defini:

 33 # HOME
 34 JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_10.jdk/Contents/Home
 35 SCALA_HOME=/Library/Scala/current
 36 FORGE_HOME=~/tools/forge/
 37 
 38 # PATH
 39 PATH="/Library/Frameworks/Python.framework/Versions/3.2/bin:${PATH}"
 40 PATH=${PATH}:${JAVA_HOME}/bin
 41 PATH=${PATH}:/bin/
 42 PATH=${PATH}:/sbin/
 43 PATH=${PATH}:/usr/bin/
 44 PATH=${PATH}:/usr/sbin/
 45 PATH=${PATH}:/opt/local/bin/
 46 PATH=${PATH}:/opt/local/sbin/
 47 PATH=${PATH}:/usr/local/git/bin
 48 PATH=${PATH}:/usr/local/git/sbin
 49 PATH=${PATH}:/Applications/Xcode.app/Contents/Developer/usr/bin
 50 PATH=${PATH}:${SCALA_HOME}/bin
 51 PATH=${PATH}:${FORGE_HOME}/bin
 52 
 53 export PATH

Quando estou executando mvn clean install --debug, vejo que, de fato, uso Java 6

  1 Apache Maven 3.0.3 (r1075438; 2011-02-28 11:31:09-0600)
  2 Maven home: /usr/share/maven
  3 Java version: 1.6.0_35, vendor: Apple Inc.
  4 Java home: /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents/Home

Onde poderia ser definido? Tenho origem (d) meu .zshrc várias vezes.

James Raitsev
fonte
2
Seu PATH não tem /usr/binprimeiro na sua lista de diretórios. Tente javac -versionsem especificar um diretório.
26512 Peter Lawrey
@PeterLawrey, i getjavac 1.7.0_10
James Raitsev 26/12/12
2
O que echo $JAVA_HOMEte diz?
Andrew Logvinov
2
E a sua variável JAVA_HOME? O mvn usará JAVA_HOME. Além disso, você está construindo a partir da linha de comando ou dentro do IDE?
26412 Lucas
8
Se você executar o Maven --debug, ele deverá informar a linha de comando exata que está sendo usada para executar javac(junto com várias outras coisas). O que isso diz?
Emil Sit

Respostas:

153

Verifique o mvnscript na sua instalação do maven para ver como ele está construindo o comando. Talvez você ou outra pessoa tenha codificado um código JAVA_HOMElá e tenha esquecido.

Ryan Stewart
fonte
8
Você senhor é o vencedor. Na verdade, alguém codificou JAVA_HOME dentro do script! OBRIGADO
James Raitsev
21
Heh, não que eu já fiz para mim mesmo antes ou nada ... :)
Ryan Stewart
4
O mvnscript não era compatível com minha instalação OSX do JDK 7 da Oracle, e eu não fiz nada sofisticado em configurá-lo (o script procura uma pasta Library/Java/JavaVirtualMachines/CurrentJDKque não existia para mim (o que existia é em jdk1.7.0_25.jdkvez de CurrentJDK). uma correção elegante, mas eu só codificado a exportação e agora ele funciona (PS: maven no OSX está em /usr/share/maven/bin/mvn)
Raekye
6
Independentes do OSX 1.9.2, com o maven instalado via homebrew, o script mvn estava localizado em/usr/local/bin/mvn
StackExchange What The Heck
1
Eu tinha um conjunto JAVA_HOME e isso deu a pista. OBRIGADO!! : D
Alfonso Nishikawa
109

tente usar uma versão mais recente do plug-in do compilador maven:

    <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.2</version>
        <configuration>
            <source>1.7</source>
            <target>1.7</target>
        </configuration>
    </plugin>

Além disso, especificar melhor a codificação do arquivo de origem no maven é feito globalmente:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

Edição : Como esta resposta ainda está recebendo atenção, eu gostaria de salientar que os valores mais recentes (a partir da última edição) são 3,2 para o plug-in do compilador maven e 1,8 para java, pois as perguntas sobre a compilação do código java 8 via maven estão vinculadas a apareça em breve :-)

radai
fonte
Adicionar "<versão> 3.0 </ versão>" corrigiu o problema.
Sriram
@radai, sua 3.2 agora, mas bobo para manter a atualização como ele nunca vai parar de aumentar ...
Lucas
@ Lucas - só não quero ser responsável por pessoas que aderem a versões desatualizadas, é tudo. não poderia viver comigo mesmo :-)
radai
Por que essa resposta tem quase cem votos positivos quando não é a solução correta para a pergunta feita? Estou perdido ...
Zero3 09/01
48

Eu tive o mesmo problema e, para resolver isso, sigo este artigo do blog: http://www.mkyong.com/java/how-to-set-java_home-environment-variable-on-mac-os-x/

$ vim .bash_profile 

export JAVA_HOME=$(/usr/libexec/java_home)

$ source .bash_profile

$ echo $JAVA_HOME
/Library/Java/JavaVirtualMachines/1.7.0.jdk/Contents/Home

tks especiais para @mkyong

EDIT: Agora estou usando: jEnv + sdkman

eliocapelati
fonte
3
Isso funcionou para mim. Estou usando um mac, com maven de macports e o sun jdk. Aparentemente, essa combinação foi complicada.
Quantum7
1
Ótimo trabalho. Obrigado por todos os comandos! Trabalha agora em Maveriks
Maksim
1
Esta é a solução mais fácil e elegante. Obrigado!
BK-
26

Verifique pom.xml nas tags abaixo

<properties>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
</properties>

deve apontar a versão jdk necessária

user4010880
fonte
19

Você precisa verificar a versão do Maven:

mvn -version

Você encontrará a versão Java que o Maven usa para compilação. Pode ser necessário redefinir JAVA_HOME, se necessário.

Loi Cao
fonte
19

Eu tive o mesmo problema. Descobri que isso ocorre porque o script Maven examina o link CurrentJDK abaixo e encontra um JDK 1.6. Mesmo se você instalar o JDK mais recente, isso não será resolvido. Enquanto você pode definir JAVA_HOME no script $ HOME / .bash_profile, escolhi corrigir o link simbólico da seguinte maneira:

ls -l /System/Library/Frameworks/JavaVM.framework/Versions/
total 64
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.4.2 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.5.0 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6 -> CurrentJDK
lrwxr-xr-x  1 root  wheel   10 30 Oct 16:18 1.6.0 -> CurrentJDK
drwxr-xr-x  9 root  wheel  306 11 Nov 21:20 A
lrwxr-xr-x  1 root  wheel    1 30 Oct 16:18 Current -> A
lrwxr-xr-x  1 root  wheel   59 30 Oct 16:18 CurrentJDK -> /System/Library/Java/JavaVirtualMachines/1.6.0.jdk/Contents

Observe que o CurrentJDK aponta para 1.6.0.jdk

Para corrigi-lo, executei os seguintes comandos (você deve verificar sua versão instalada e adaptar em conformidade).

sudo rm /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
sudo ln -s /Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/ /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
Chris McCarthy
fonte
Se instalação limpa mostra -Debug MVn Java 1.6 esta é a resposta correta
Cetnar
4

Diagnóstico:

Você pode ver qual versão java o Maven usa executando "mvn --version"

Solução para o Debian:

O script mvn define a variável env JAVA_HOME internamente procurando javac (qual javac). Portanto, se você tiver várias versões java instaladas simultaneamente, por exemplo, JDK 6 e JDK 7 e usar o sistema Debian Alternatives para escolher entre elas, mesmo que tenha alterado a alternativa de "java" para JDK 7, o mvn ainda utilizará o JDK 6. Você tem que mudar a alternativa para "javac" também. Por exemplo:

# update-alternatives --set javac /usr/lib/jvm/java-7-openjdk-amd64/bin/javac

EDITAR:

Na verdade, uma solução ainda melhor é usar o update-java-alternative (por exemplo)

# update-java-alternatives -s java-1.7.0-openjdk-amd64

conforme detalhado em https://wiki.debian.org/JavaPackage , porque isso mudará todas as alternativas para várias ferramentas Java (há uma dúzia ou mais).

user323094
fonte
Obrigado, exatamente o que eu estava procurando
evandongen
Obrigado, eu estava confuso depois de definir a versão java com: update-alternatives --config javac
Leonard Saers
2

Você poderia tentar um plugin mais recente; no site maven:

<version>3.0</version>

Também vi o seguinte:

<compilerVersion>1.7</compilerVersion>
Joop Eggen
fonte
Não funciona. [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.0:compile (default-compile) on project divs: Fatal error compiling: invalid target release: 1.7 -
26612 James Raitsev
Eu usei com sucesso o 2.3.2 para compilar 1.7 antes ... Mas sempre é bom usar o mais recente, se possível.
26412 Lucas
Pesquisou mais. Verifique o gerenciamento do plug-in de dependência, se você o usar.
Joop Eggen
Adicionado <pluginDependency>, mesmo problema
James Raitsev
Se for um projeto de módulo, vale a pena examinar o projeto pai. Este não pode ser o caso aqui. O maven está executando com o java 1.7?
Joop Eggen
2

Tente alterar as configurações do compilador Java em Propriedades no Eclipse-

Ir para: Preferências-> Java-> Compilador-> Nível de Conformidade do Compilador-> 1.7 Aplicar Ok

Reinicie o IDE.

Confirme a configuração do compilador para o projeto- Goto: Propriedades do projeto-> Java Compiler-> Desmarque (Use Conformidade no ambiente de execução 'JavaSE-1.6' no caminho Java Build). E selecione 1.7 na lista suspensa. (Ignore se já estiver 1,7)

Reinicie o IDE.

Se o problema persistir, execute casos de teste individuais usando o comando no terminal

mvn -Dtest=<test class name> test
Mithun Khatri
fonte
2

Não sei ao certo o que o sistema operacional está em uso aqui, mas você pode eliminar muitas versões java futzing un debian / ubuntu com update-java-alternative para definir todo o sistema jvm padrão.

#> update-java-alternatives -l
java-1.6.0-openjdk-amd64 1061 /usr/lib/jvm/java-1.6.0-openjdk-amd64
java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-6-sun 63 /usr/lib/jvm/java-6-sun
java-7-oracle 1073 /usr/lib/jvm/java-7-oracle

Para definir um novo, use:

#> update-java-alternatives -s java-7-oracle

Não é necessário definir JAVA_HOME para a maioria dos aplicativos.

Bruce Edge
fonte
2

clique com o botão direito do mouse no seu projeto no eclipse e abra "Run Configurations". verifique a versão do jre lá. algumas vezes isso não muda por padrão no eclipse, mesmo após alterar a versão no caminho de construção.

Ravav Reddy
fonte
2

Para uma compilação específica que requer uma /etc/alternatives/javaJVM (não padrão ), considere prefixar o mvncomando JAVA_HOMEcomo este,

JAVA_HOME=/usr/lib/jvm/java-7-openjdk-amd64/ mvn package

Aqui assumimos que o padrão é Java 8, enquanto que para o projeto específico em questão exigimos o Java 7.

olmo
fonte
Isso funcionou melhor para mim como então lá não precisa ser mudanças realizadas para a fonte do project6 baixado GIT (ou SCM)
jwilleke
Esta resposta merece mais votos. Ele me ajudou a compilar um código requerendo Java 7 na minha máquina onde padrão foi Java 8 - sem ter que instalar e re-instalar Java7 e Java 8.
R11G
1

{JAVA_1_4_HOME} / bin / javacyou pode tentar também ...

<plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <showDeprecation>true</showDeprecation>
                <showWarnings>true</showWarnings>
                <executable>{JAVA_HOME_1_7}/bin/javac</executable>
                <fork>true</fork>
        </configuration>
    </plugin>
baybora.oren
fonte
4
Você não deve codificar o caminho em nenhum código que será compartilhado.
Jan Segre
@Jan Segre, ok eu mudá-lo :)
baybora.oren
0

Ok, eu também resolvi esse problema sozinho. É mais importante o seu JAVA_HOME, se você não tiver uma versão inferior ou nenhuma comparada às propriedades de origem / destino do plug-in Maven, você receberá esse erro.

Certifique-se de ter uma boa versão em seu JAVA_HOME e incluí-la em seu PATH.

Silviu Burcea
fonte
0

Você pode estar especificando uma versão errada do java. versão-java (no seu terminal) para verificar a versão do java que você está usando. Vá para o maven-compile-plugin para obter a versão mais recente do compilador maven. Seu plugin pode aparecer assim se você estiver usando o java 6 e a versão mais recente do plugin maven compiler for 3.1

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.1</version>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
Henry
fonte
0

Nenhuma das respostas anteriores resolveu completamente meu caso de uso.

Necessário para remover o diretório que estava sendo construído. Limpar \ limpo. E depois reinstale. Parece um problema de permissões silenciosas.

Piperchester
fonte
0

Eu tive esse problema no IntelliJ IDEA 14 até entrar no menu Arquivo -> Estrutura do projeto, alterando o SDK do projeto para 1,7 e o nível de idioma do projeto para 7.

Jon Onstott
fonte
0

Eu tive esse problema ao trabalhar com o eclipse, tive que alterar o caminho de construção do projeto para que ele se refira ao jre 7

osama yaccoub
fonte