O que faz com que o projeto Maven importado no Eclipse use o Java 1.5 em vez do Java 1.6 por padrão e como posso garantir que não?

209

Importei um projeto Maven e ele usou o Java 1.5, embora eu tenha o 1.6 configurado como meu padrão do Eclipse Preferences->Java->Installed JREs.

Quando mudei o projeto Maven para usar o JRE 1.6, ele ainda apresentava os erros de compilação de quando o projeto estava usando o Java 1.5 (eu descrevi esses erros de compilação anteriormente em: Tenho erros de compilação com m2eclipse, mas não com maven2 na linha de comando - meu m2eclipse está configurado incorretamente? )

Vou excluir o projeto e tentar novamente, mas quero garantir que desta vez use o Java 1.6 desde o início, para ver se isso elimina os problemas de compilação.

Como garantir que o projeto use o Java 1.6 ao importá-lo?

Chris Collins
fonte
4
m2eclipse ignora o que você configura para o padrão do Eclipse. Ele sempre usará 1,5 por padrão. No entanto, no seu caso, o projeto usa o maven-compiler-plugin e define a versão explicitamente para 1.5. Você precisará alterar isso no pom e atualizar a configuração do projeto para alterar a versão. No entanto, eu já tentei isso e não funcionou para mim. Tenho certeza de que esse não é o problema, apesar do que os outros disseram em sua outra pergunta.
Raoul Duke
1
Não, o m2eclipse nem sempre será o padrão para 1,5; ele será o padrão para as configurações do maven-compiler-plugin.
Pascal Thivent
1
Como você altera as configurações do maven-compiler-plugin?
Lokathor

Respostas:

248

O plug-in m2eclipse não usa os padrões do Eclipse, o plug-in m2eclipse deriva as configurações do POM. Portanto, se você deseja que um projeto Maven seja configurado para usar as configurações do Java 1.6 quando importado no Eclipse, configure-o maven-compiler-pluginadequadamente, como já sugeri:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <version>2.1</version>
  <configuration>
    <source>1.6</source>
    <target>1.6</target>
  </configuration>
</plugin>

Se o seu projeto já tiver sido importado, atualize a configuração do projeto ( clique com o botão direito do mouse no projeto e, em seguida, em Maven V Update Project Configuration ).

Pascal Thivent
fonte
1
Por favor, não grite. Isso é rude. Funcionou após excluir e reimportar o projeto. Mas não de outra forma.
Raoul Duke
6
@ Raoul Funciona sem reimportar o projeto se você atualizar a configuração do projeto, como escrevi. Eu testei isso 3 vezes e ele simplesmente funciona na minha máquina.
Pascal Thivent
Tão clara quanto a resposta de Pascal é (acrescentei-a) a 'atualização da configuração do projeto' não parece funcionar em todas as circunstâncias, pois eu também precisei remover o projeto e tentei muitas outras coisas (talvez um bug em uma versão do eclipse)
rogermushroom 27/10
para mais recentes versões do Java, veja esta resposta
Linha
33

Adicionei isso ao meu pom.xml abaixo da descrição do projeto e funcionou:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
hogi
fonte
1
Isso é mais simples que a resposta aceita e também foi bom para mim.
Brick
1
Isso funcionou para mim, no entanto, a resposta aceita não funcionou.
Sanjay Singh
1
Qual é a diferença entre isso e a configuração do maven-compiler-plugin (conforme resposta aceita)? Os dois caminhos estão funcionando para mim.
Aamir Rizwan
Se você estiver usando o Java 9, esteja ciente de que a numeração da versão foi alterada. Então use 9 em vez de 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
Chux
Eu pensei que definir uma propriedade "java.version" e usá-la na configuração de compilação da configuração "maven-compiler-plugin" era suficiente. Obviamente, as propriedades "maven.compiler.source" e "maven.compiler.target" devem ter alguma interação do plug-in do Eclipse Maven, pois o problema desapareceu.
JasonTolotta
29

Eu queria adicionar algo à resposta já fornecida. O maven-compiler-plugin por padrão irá compilar seu projeto usando Java 1.5, que é onde o m2e obtém suas informações.

É por isso que você precisa declarar explicitamente o maven-compiler-plugin no seu projeto com algo diferente de 1.5. Seu efetivo pom.xmlusará implicitamente o conjunto padrão no maven-compiler-plugin pom.xml .

Nicholas
fonte
6
para mim, isso responde com mais clareza "por que é 1,5 quando faço um novo projeto Maven?"
Don Cheadle
1
@LIttleAncientForestKami verificado com 3.7.0, a essa altura os valores são definidos como constantes DEFAULT_SOURCEe DEFAULT_TARGET, mas ainda ambos são definidos como 1,5.
Adam Burley
agora deve ser 1.6, certo? Eu me pergunto, porque ainda parece usar 1,5 para mim.
Linha
@Line: Não, provavelmente será de 1,5 até o final do verso conhecido, já que o pom pai super eficaz nunca deve mudar.
Nicholas
Isso é ironia? ;) O site que está ligado na resposta diz: "Observe também que, actualmente, a configuração da fonte padrão é 1.6 e a configuração de destino padrão é 1,6" ..
Linha
27
<project>

    <!-- ... -->

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.2</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>
pitchblack408
fonte
8
Por dentro <build> </build>
Phillip Kamikaze
não gosto dessa resposta, porque é apenas código, e não vejo vantagem sobre a aceita (talvez porque não esteja descrita ..) #
Line
8

Aqui está a causa raiz do java 1.5:

Observe também que atualmente a configuração de origem padrão é 1,5 e a configuração de destino padrão é 1,5, independentemente do JDK com o qual você executa o Maven. Se você deseja alterar esses padrões, defina a origem e o destino.

Referência: Plugin do Compilador Apache Mavem

A seguir estão os detalhes:

Pom.xml simples

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
             http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

    <groupId>com.pluralsight</groupId>
    <artifactId>spring_sample</artifactId>
    <version>1.0-SNAPSHOT</version>

</project>

O plug-in a seguir é obtido de uma versão expandida do POM (Effective POM),

Isso pode ser obtido por esse comando na linha de comando C:\mvn help:effective-pom. Acabei de colocar aqui um pequeno trecho em vez de um pom inteiro.

    <plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.1</version>
    <executions>
      <execution>
        <id>default-compile</id>
        <phase>compile</phase>
        <goals>
          <goal>compile</goal>
        </goals>
      </execution>
      <execution>
        <id>default-testCompile</id>
        <phase>test-compile</phase>
        <goals>
          <goal>testCompile</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Mesmo aqui você não vê onde está definida a versão java, vamos cavar mais ...

Faça o download do plug-in, Apache Maven Compiler Plugin »3.1 como disponível no jar e abra-o em qualquer ferramenta de compactação de arquivos como o 7-zip

Atravesse o frasco e encontre

plugin.xml

arquivo dentro da pasta

maven-compiler-plugin-3.1.jar \ META-INF \ maven \

Agora você verá a seguinte seção no arquivo,

      <configuration>
    <basedir implementation="java.io.File" default-value="${basedir}"/>
    <buildDirectory implementation="java.io.File" default-value="${project.build.directory}"/>
    <classpathElements implementation="java.util.List" default-value="${project.testClasspathElements}"/>
    <compileSourceRoots implementation="java.util.List" default-value="${project.testCompileSourceRoots}"/>
    <compilerId implementation="java.lang.String" default-value="javac">${maven.compiler.compilerId}</compilerId>
    <compilerReuseStrategy implementation="java.lang.String" default-value="${reuseCreated}">${maven.compiler.compilerReuseStrategy}</compilerReuseStrategy>
    <compilerVersion implementation="java.lang.String">${maven.compiler.compilerVersion}</compilerVersion>
    <debug implementation="boolean" default-value="true">${maven.compiler.debug}</debug>
    <debuglevel implementation="java.lang.String">${maven.compiler.debuglevel}</debuglevel>
    <encoding implementation="java.lang.String" default-value="${project.build.sourceEncoding}">${encoding}</encoding>
    <executable implementation="java.lang.String">${maven.compiler.executable}</executable>
    <failOnError implementation="boolean" default-value="true">${maven.compiler.failOnError}</failOnError>
    <forceJavacCompilerUse implementation="boolean" default-value="false">${maven.compiler.forceJavacCompilerUse}</forceJavacCompilerUse>
    <fork implementation="boolean" default-value="false">${maven.compiler.fork}</fork>
    <generatedTestSourcesDirectory implementation="java.io.File" default-value="${project.build.directory}/generated-test-sources/test-annotations"/>
    <maxmem implementation="java.lang.String">${maven.compiler.maxmem}</maxmem>
    <meminitial implementation="java.lang.String">${maven.compiler.meminitial}</meminitial>
    <mojoExecution implementation="org.apache.maven.plugin.MojoExecution">${mojoExecution}</mojoExecution>
    <optimize implementation="boolean" default-value="false">${maven.compiler.optimize}</optimize>
    <outputDirectory implementation="java.io.File" default-value="${project.build.testOutputDirectory}"/>
    <showDeprecation implementation="boolean" default-value="false">${maven.compiler.showDeprecation}</showDeprecation>
    <showWarnings implementation="boolean" default-value="false">${maven.compiler.showWarnings}</showWarnings>
    <skip implementation="boolean">${maven.test.skip}</skip>
    <skipMultiThreadWarning implementation="boolean" default-value="false">${maven.compiler.skipMultiThreadWarning}</skipMultiThreadWarning>
    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <staleMillis implementation="int" default-value="0">${lastModGranularityMs}</staleMillis>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>
    <testSource implementation="java.lang.String">${maven.compiler.testSource}</testSource>
    <testTarget implementation="java.lang.String">${maven.compiler.testTarget}</testTarget>
    <useIncrementalCompilation implementation="boolean" default-value="true">${maven.compiler.useIncrementalCompilation}</useIncrementalCompilation>
    <verbose implementation="boolean" default-value="false">${maven.compiler.verbose}</verbose>
    <mavenSession implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
    <session implementation="org.apache.maven.execution.MavenSession" default-value="${session}"/>
  </configuration>

Veja o código acima e descubra as 2 linhas a seguir

    <source implementation="java.lang.String" default-value="1.5">${maven.compiler.source}</source>
    <target implementation="java.lang.String" default-value="1.5">${maven.compiler.target}</target>

Boa sorte.

rapaz desonesto
fonte
1
Sim. Isso não tem nada a ver com o Eclipse. Por exemplo, você obtém o mesmo problema no IntelliJ IDEA se criar um projeto Maven com o quickstartartefato.
Jan Hettich
Olá, obrigado por postar a causa do problema:) Eu realmente aprecio isso!
58560 Ian Ian G # 1/18
6

Seu JRE provavelmente foi definido na configuração de execução. Siga estas etapas no Eclipse para alterar o JRE de construção.

1) Clique com o botão direito do mouse no projeto e selecione Executar como > Executar configurações

2) Na janela Executar configurações, selecione a configuração de construção do seu projeto no painel esquerdo. À direita, você verá várias guias: Principal, JRE, Atualizar, Origem, ...

3) Clique na guia JRE, você verá algo parecido com isto

insira a descrição da imagem aqui

4) Por padrão, o JRE padrão de trabalho (o JRE selecionado como padrão em Preferências-> Java-> JREs instalados ) será usado. Se você deseja usar outro JRE instalado, marque a caixa de seleção Alternate JRE e selecione seu JRE preferido no menu suspenso.

Tony Vu
fonte
Obrigado por esta resposta, minha configuração de execução estava em execução com o padrão da área de trabalho, então isso realmente ajudou!
Damir Ciganović-Janković 23/11
Isso ajudou, não acredito que esquecemos disso!
phil oO
3

Solução mais simples no Springboot

Darei a você a mais simples, se você usar o Springboot:

<properties>
  <java.version>1.8</java.version>
</properties>

Em seguida, clique com o botão direito do mouse em seu projeto Eclipse: Maven> Atualizar projeto> Atualizar configuração do projeto a partir de pom.xml

Isso deve servir.

sancho21
fonte
2

Configurações específicas do projeto

Mais um lugar onde isso pode dar errado é nas configurações específicas do projeto, no Eclipse.

  1. propriedades do projeto: clique no seu projeto e siga um destes procedimentos:

    • Alt + Enter
    • Menu> Projeto> Propriedades
    • clique com o botão direito do mouse em seu projeto> propriedades do projeto (último item no menu)
  2. clique em "Java Compiler"

  3. Desmarque a opção "Ativar configurações específicas do projeto" (ou altere todas manualmente).

Por causa dos requisitos do cliente, permitimos que eles mantivessem nossos projetos na versão 1.6. Quando foi necessário atualizar para o 1.7, tivemos dificuldades porque precisávamos alterar a versão java em todo o lugar:

  • projeto POM
  • Padrão do Espaço de Trabalho Eclipse
  • configurações específicas do projeto
  • executando máquina virtual (1.6 foi usado para tudo)
manuelvigarcia
fonte
1

Mais um motivo possível se você estiver usando o Tycho e o Maven para criar pacotes configuráveis, que possui um ambiente de execução incorreto ( Bundle-RequiredExecutionEnvironment) no arquivo de manifesto ( manifest.mf) definido. Por exemplo:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Engine Plug-in
Bundle-SymbolicName: com.foo.bar
Bundle-Version: 4.6.5.qualifier
Bundle-Activator: com.foo.bar.Activator
Bundle-Vendor: Foobar Technologies Ltd.
Require-Bundle: org.eclipse.core.runtime,
 org.jdom;bundle-version="1.0.0",
 org.apache.commons.codec;bundle-version="1.3.0",
 bcprov-ext;bundle-version="1.47.0"
Bundle-RequiredExecutionEnvironment: JavaSE-1.5
Export-Package: ...
...
Import-Package: ...
...

No meu caso, tudo estava bem. Os plugins do compilador (maven normal e tycho também) foram definidos corretamente, ainda assim o m2 gerou um nível de conformidade antigo por causa do manifesto. Eu pensei em compartilhar a experiência.

Gábor Lipták
fonte
1

Eu descobri que meu problema era alguém que confirmou o arquivo .project e .classpath que tinha referências ao Java1.5 como o JRE padrão.

<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5">
    <attributes>
        <attribute name="owner.project.facets" value="java"/>
    </attributes>
</classpathentry>

Fechando o projeto, removendo os arquivos e reimportando-o como um projeto Maven, pude configurá-lo adequadamente para usar o espaço de trabalho JRE ou o jdk relevante sem que ele volte para 1,5. Portanto, evite verificar em seu SVN os arquivos .project e .classpath

Espero que isso ajude os outros.

iowatiger08
fonte
0

Se você deseja garantir que projetos recém-criados ou importados no Eclipse usem outra versão java padrão que não seja Java 1.5, é possível alterar a configuração no maven-compiler-plugin.

  • Vá para a pasta .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Abra o maven-compiler-plugin-3.1.jar com um programa zip.
  • Vá para META-INF / maven e abra o plugin.xml
  • Nas seguintes linhas:
    <source deployment = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </source>
    <target deployment = "java.lang.String" default-value = "1.5"> $ {maven.compiler.target} </target>

  • altere o valor padrão para 1.6 ou 1.8 ou o que quiser.

  • Salve o arquivo e verifique se ele está gravado de volta no arquivo zip.

A partir de agora, todos os novos projetos Maven usam a versão java que você especificou.

As informações são da seguinte postagem no blog: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

user1201626
fonte
0

Para alterar a versão do JDK, você pode:

1- Projeto> Propriedades
2- Vá para o Java Build Path
3- Em Bibliotecas, selecione JRE System ... e clique em Editar
4- Escolha sua versão apropriada e valide

Achref EL Mouelhi
fonte