¿Qué causa que el proyecto Maven importado en Eclipse use Java 1.5 en lugar de Java 1.6 por defecto y cómo puedo asegurarme de que no lo haga?

209

Importé un proyecto de Maven y usé Java 1.5 aunque tengo 1.6 configurado como mi valor predeterminado de Eclipse Preferences->Java->Installed JREs.

Cuando cambié el proyecto Maven para usar el 1.6 JRE, todavía tenía los errores de compilación de cuando el proyecto estaba usando Java 1.5 (describí estos errores de compilación anteriormente: Tengo errores de compilación con m2eclipse pero no con maven2 en la línea de comando - ¿mi m2eclipse está mal configurado? )

Voy a eliminar el proyecto e intentarlo de nuevo, pero quiero asegurarme de que esta vez use Java 1.6 desde el principio para ver si esto elimina los problemas de compilación.

¿Cómo me aseguro de que el proyecto usa Java 1.6 cuando lo importo?

Chris Collins
fuente
44
m2eclipse ignora lo que configura para el valor predeterminado de Eclipse. Siempre usará 1.5 por defecto. Sin embargo, en su caso, el proyecto utiliza el complemento compilador-maven y establece la versión explícitamente en 1.5. Deberá cambiar eso en el pom y actualizar la configuración del proyecto para cambiar la versión. Sin embargo, ya lo intenté y no funcionó para mí. Estoy bastante seguro de que ese no es el problema a pesar de lo que otros dijeron en su otra pregunta.
Raoul Duke
1
No, m2eclipse no siempre tendrá el valor predeterminado 1.5, sino la configuración del plugin maven-compiler.
Pascal Thivent
1
¿Cómo se cambia la configuración de maven-compiler-plugin?
Lokathor

Respuestas:

248

El complemento m2eclipse no utiliza los valores predeterminados de Eclipse, el complemento m2eclipse deriva la configuración del POM. Entonces, si desea que un proyecto de Maven se configure para usar la configuración de Java 1.6 cuando se importe en Eclipse, configúrelo maven-compiler-pluginadecuadamente, como ya sugerí:

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

Si su proyecto ya está importado, actualice la configuración del proyecto ( haga clic con el botón derecho en el proyecto y luego en Maven V Actualizar configuración del proyecto ).

Pascal Thivent
fuente
1
Por favor no grites. Eso es simplemente grosero. Funcionó después de eliminar y volver a importar el proyecto. Pero no de otra manera.
Raoul Duke el
66
@Raoul Funciona sin volver a importar el proyecto si actualiza la configuración del proyecto como escribí. Probé esto 3 veces y simplemente funciona en mi máquina.
Pascal Thivent
Tan claro como la respuesta de Pascal es (más 1 lo hice) 'actualizar la configuración del proyecto' no parece funcionar en todas las circunstancias, ya que también tuve que eliminar el proyecto, e intenté muchas otras cosas (tal vez un error en una versión de eclipse)
rogermushroom
para las versiones más nuevas de Java, vea esta respuesta
Línea
33

Agregué esto a mi pom.xml debajo de la descripción del proyecto y funcionó:

<properties>
    <maven.compiler.source>1.6</maven.compiler.source>
    <maven.compiler.target>1.6</maven.compiler.target>
</properties>
Hogi
fuente
1
Esto es más simple que la respuesta aceptada y también fue bueno para mí.
Brick
1
Esto funcionó para mí, sin embargo, la respuesta aceptada no funcionó.
Sanjay Singh
1
¿Cuál es la diferencia entre esto y la configuración de maven-compiler-plugin (según la respuesta aceptada)? Ambas formas están funcionando para mí.
Aamir Rizwan
Si está utilizando Java 9, tenga en cuenta que la numeración de la versión ha cambiado. Entonces use 9 en lugar de 1.9. <properties> <maven.compiler.source>9</maven.compiler.source> <maven.compiler.target>9</maven.compiler.target> </properties>
chux
Pensé que era suficiente establecer una propiedad "java.version" y usarla en la configuración de compilación de la configuración "maven-compiler-plugin". Obviamente, las propiedades "maven.compiler.source" y "maven.compiler.target" deben tener cierta interacción con el complemento Eclipse Maven ya que el problema simplemente desapareció.
JasonTolotta
29

Quería agregar algo a la respuesta ya proporcionada. maven-compiler-plugin por defecto compilará su proyecto usando Java 1.5, que es donde m2e obtiene su información.

Es por eso que debe declarar explícitamente el complemento de compilador maven en su proyecto con algo diferente a 1.5. Su efectivo pom.xmlutilizará implícitamente el conjunto predeterminado en el complemento compilador maven pom.xml .

Nicholas
fuente
66
para mí esto responde más claramente "¿por qué es 1.5 cuando hago un nuevo proyecto Maven?"
Don Cheadle
1
@LIttleAncientForestKami verificado con 3.7.0, por ahora los valores están establecidos como constantes DEFAULT_SOURCEy DEFAULT_TARGET, pero aún ambos están establecidos en 1.5.
Adam Burley
ahora debería ser 1.6, ¿verdad? Me pregunto porque todavía parece usar 1.5 para mí.
Línea del
@Line: No, es probable que sean 1.5 hasta el final del conocido maven-verse ya que el pom padre súper efectivo nunca debería cambiar.
Nicholas
¿Es esto ironía? ;) El sitio que está vinculado en la respuesta dice "También tenga en cuenta que en la actualidad la configuración de origen predeterminada es 1.6 y la configuración de destino predeterminada es 1.6" ..
Línea
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
fuente
8
Inside <build> </build>
Phillip Kamikaze el
no me gusta esta respuesta, porque es solo código, y no veo ventaja sobre el aceptado (tal vez porque no se describe ...)
Línea
8

Aquí está la causa raíz de Java 1.5:

También tenga en cuenta que actualmente la configuración de origen predeterminada es 1.5 y la configuración de destino predeterminada es 1.5, independientemente del JDK con el que ejecuta Maven. Si desea cambiar estos valores predeterminados, debe establecer el origen y el destino.

Referencia: Complemento Apache Mavem Compiler

Los siguientes son los detalles:

Pom.xml liso

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

El siguiente complemento se toma de una versión expandida de POM (POM efectivo),

Esto se puede obtener con este comando desde la línea de comandos C:\mvn help:effective-pom. Acabo de poner aquí un pequeño fragmento en lugar de un pom entero.

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

Incluso aquí no ves dónde se define la versión de Java, vamos a cavar más ...

Descargue el complemento Apache Maven Compiler Plugin »3.1 como está disponible en jar y ábralo en cualquier herramienta de compresión de archivos como 7-zip

Atraviesa el frasco y descubre

plugin.xml

archivo dentro de la carpeta

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

Ahora verá la siguiente sección en el archivo,

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

Mire el código anterior y descubra las siguientes 2 líneas

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

Buena suerte.

muchacho rebelde
fuente
1
Si. Esto no tiene nada que ver con Eclipse. Por ejemplo, obtiene el mismo problema en IntelliJ IDEA si crea un proyecto Maven con el quickstartartefacto.
Jan Hettich
Hola, gracias por publicar la causa raíz del problema:) ¡Realmente lo aprecio!
IanGabes
6

Su JRE probablemente se definió en la configuración de ejecución. Siga estos pasos en Eclipse para cambiar la compilación JRE.

1) Haga clic derecho en el proyecto y seleccione Ejecutar como > Ejecutar configuraciones

2) En la ventana Ejecutar configuraciones, seleccione la configuración de compilación de su proyecto en el panel izquierdo. A la derecha, verá varias pestañas: Principal, JRE, Actualizar, Fuente, ...

3) Haga clic en la pestaña JRE, debería ver algo como esto

ingrese la descripción de la imagen aquí

4) De forma predeterminada, se utilizará JRE predeterminado de trabajo (el JRE que seleccione como predeterminado en Preferencias-> Java-> JRE instalados ). Si desea utilizar otro JRE instalado, marque la casilla de verificación JRE alternativo y seleccione su JRE preferido en el menú desplegable.

Tony Vu
fuente
Gracias por esta respuesta, mi configuración de ejecución se ejecutaba con el espacio de trabajo predeterminado, ¡así que esto realmente ayudó!
Damir Ciganović-Janković
Esto ayudó, ¡no puedo creer que hayamos pasado esto por alto!
phil oO
3

La solución más simple en Springboot

Te daré la más simple si usas Springboot:

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

Luego, haga clic derecho en su proyecto Eclipse: Maven> Actualizar proyecto> Actualizar configuración del proyecto desde pom.xml

Eso debería hacer.

sancho21
fuente
2

Configuraciones específicas del proyecto

Un lugar más donde esto puede salir mal es en la configuración específica del proyecto, en Eclipse.

  1. propiedades del proyecto: haga clic en su proyecto y en uno de los siguientes:

    • Alt + Enter
    • Menú> Proyecto> Propiedades
    • haga clic derecho en su proyecto> propiedades del proyecto (último elemento en el menú)
  2. haga clic en "Compilador Java"

  3. Desmarque "Habilitar configuraciones específicas del proyecto" (o cámbielas todas a mano).

Debido a los requisitos del cliente, los habilitamos para mantener nuestros proyectos en 1.6. Cuando era necesario actualizar a 1.7, tuvimos dificultades porque necesitábamos cambiar la versión de Java por todas partes:

  • proyecto POM
  • Eclipse Workspace predeterminado
  • configuración específica del proyecto
  • ejecutando máquina virtual (1.6 fue usado para todo)
manuelvigarcia
fuente
1

Una posible razón más si está utilizando Tycho y Maven para construir paquetes, es que tiene un entorno de ejecución incorrecto ( Bundle-RequiredExecutionEnvironment) en el archivo de manifiesto ( manifest.mf) definido. Por ejemplo:

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

En mi caso, todo lo demás estaba bien. Los complementos del compilador (maven normal y tycho también) se configuraron correctamente, todavía m2 generó un nivel de cumplimiento antiguo debido al manifiesto. Pensé compartir la experiencia.

Gábor Lipták
fuente
1

Descubrí que mi problema era que alguien había cometido el archivo .project y .classpath que tenía referencias a Java1.5 como el JRE predeterminado.

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

Al cerrar el proyecto, eliminar los archivos y luego volver a importarlo como proyecto Maven, pude configurar correctamente el proyecto para usar el espacio de trabajo JRE o el jdk relevante sin que volviera a 1.5. Por lo tanto, evite registrar en su SVN los archivos .project y .classpath

Espero que esto ayude a otros.

iowatiger08
fuente
0

Si desea asegurarse de que los proyectos recién creados o importados en Eclipse usen otra versión predeterminada de Java que no sea Java 1.5, puede cambiar la configuración en el complemento de compilación maven.

  • Vaya a la carpeta .m2 / repository / org / apache / maven / plugins / maven-compiler-plugin / 3.1
  • Abra maven-compiler-plugin-3.1.jar con un programa zip.
  • Vaya a META-INF / maven y abra el plugin.xml
  • En las siguientes líneas:
    <source implement = "java.lang.String" default-value = "1.5"> $ {maven.compiler.source} </source>
    <target implement = "java.lang.String" default-value = "1.5"> $ {maven.compiler.target} </target>

  • cambie el valor predeterminado a 1.6 o 1.8 o lo que quiera.

  • Guarde el archivo y asegúrese de que esté escrito nuevamente en el archivo zip.

De ahora en adelante, todos los proyectos nuevos de Maven utilizarán la versión de Java que especificó.

La información es de la siguiente publicación de blog: https://sandocean.wordpress.com/2019/03/22/directly-generating-maven-projects-in-eclipse-with-java-version-newer-than-1-5/

usuario1201626
fuente
0

Para cambiar la versión de JDK, puede hacer:

1- Proyecto> Propiedades
2- Vaya a Java Build Path
3- En Bibliotecas, seleccione Sistema JRE ... y haga clic en Editar
4- Elija su versión adecuada y valide

Achref EL Mouelhi
fuente