oxygen - ¿Qué hace que el proyecto Maven importado en Eclipse use Java 1.5 en lugar de Java 1.6 de forma predeterminada y cómo puedo asegurarme de que no?
eclipse oxygen download (10)
Importé un proyecto de Maven y usé Java 1.5 aunque tengo 1.6 configurado como mi Preferences->Java->Installed JREs
Eclipse por Preferences->Java->Installed JREs
.
Cuando cambié el proyecto de Maven para usar el JRE 1.6, aún faltaban los errores de compilación de cuando el proyecto estaba usando Java 1.5 (describí estos errores de compilación anteriormente: he compilado errores con m2eclipse pero no con maven2 en la línea de comandos - es mi m2eclipse mal configurado? )
Voy a eliminar el proyecto e intentarlo de nuevo, pero quiero asegurarme esta vez de que utiliza Java 1.6 desde el principio para ver si esto elimina los problemas de compilación.
¿Cómo me aseguro de que el proyecto use Java 1.6 cuando lo importe?
Ajustes específicos del proyecto
Un lugar más donde esto puede salir mal es en la configuración específica del proyecto, en Eclipse.
Propiedades del proyecto: haga clic en su proyecto y uno de los siguientes:
- Alt + Enter
- Menú> Proyecto> Propiedades
- haga clic derecho en su proyecto> propiedades del proyecto (último elemento en el menú)
haga clic en "Java Compiler"
- Desmarque "Habilitar configuraciones específicas del proyecto" (o cámbielas todas a mano).
Debido a los requisitos de los clientes, los tuvimos habilitados para mantener nuestros proyectos en 1.6. Cuando fue necesario actualizar a 1.7, tuvimos dificultades porque necesitábamos cambiar la versión de Java por todas partes:
- proyecto POM
- Eclipse Workspace por defecto
- ajustes específicos del proyecto
- Ejecutando máquina virtual (1.6 fue usado para todo)
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>
Aquí está la causa raíz de java 1.5:
También tenga en cuenta que en la actualidad 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 se ejecuta Maven. Si desea cambiar estos valores predeterminados, debe establecer el origen y el destino.
Referencia: Apache Mavem Compiler Plugin
Los siguientes son los detalles:
Pom.xml simple
<?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 está tomado de una versión expandida de POM (Effective POM),
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 de código en lugar de un pom completo.
<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 está definida la versión de Java, vamos a cavar más ...
Descargue el plugin, Apache Maven Compiler Plugin »3.1 como disponible en jar y ábralo en cualquier herramienta de compresión de archivos como 7-zip
Recorrer el frasco y la aleta.
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>
Mira el código de arriba y descubre 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.
Descubrí que mi problema era que alguien cometió el archivo .project y .classpath que tenían 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 importar como un proyecto de Maven, pude configurar correctamente el proyecto para que utilice JRE del área de trabajo o el jdk relevante sin que vuelva a 1.5. Por lo tanto, evite registrar en su SVN los archivos .project y .classpath
Espero que esto ayude a los demás.
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 bajo Eclipse, configure el maven-compiler-plugin
como corresponda, 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 Update Project Configuration ).
Quería agregar algo a la respuesta ya provista. maven-compiler-plugin por defecto compilará su proyecto usando Java 1.5, que es donde m2e obtiene su información.
Es por eso que tiene que declarar explícitamente el maven-compiler-plugin en su proyecto con algo distinto a 1.5. Su pom.xml
efectivo utilizará implícitamente el conjunto predeterminado en el maven-compiler-plugin pom.xml
maven-compiler-plugin .
Su JRE probablemente se definió en la configuración de ejecución. Siga estos pasos en Eclipse para cambiar el JRE de compilación.
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 del proyecto en el panel izquierdo. A la derecha, verá varias pestañas: Main, JRE, Refresh, Source, ...
3) Haga clic en la pestaña JRE, debería ver algo como esto
4) De forma predeterminada, se utilizará el 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 Alternar JRE y seleccione su JRE preferido en el menú desplegable.
Una posible razón más si está utilizando Tycho y Maven para crear paquetes, tiene un entorno de ejecución incorrecto ( Bundle-RequiredExecutionEnvironment
) en el archivo de manifest.mf
( 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 y tycho normales también) se configuraron correctamente, todavía m2 generó un nivel de cumplimiento anterior debido al manifiesto. Pensé que compartía la experiencia.
La solución más simple en Springboot
Te daré el más simple si usas Springboot:
<properties>
<java.version>1.8</java.version>
</properties>
Luego, haga clic con el botón derecho en su proyecto de Eclipse: Maven> Actualizar proyecto> Actualizar la configuración del proyecto desde pom.xml
Eso debería hacer.
<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>