¿Cómo se especifica la versión del compilador de Java en un archivo pom.xml?

252

Escribí un código maven en netbeans que tiene aproximadamente más de 2000 líneas. Cuando lo compilo en netbeans, todo está bien, pero si quiero ejecutarlo en la línea de comandos, obtendré estos errores:

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        HashSet<Double> resid_List = new HashSet<Double>(Arrays.asList(resid_val));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
        List<Integer> ind_ovlpList = new ArrayList<Integer>(Arrays.asList(ind_ovlp));

generics are not supported in -source 1.3
(use -source 5 or higher to enable generics)
public class ColumnComparator implements Comparator<double[]> {

annotations are not supported in -source 1.3
(use -source 5 or higher to enable annotations)
@Override

Intenté usar Java 1.3.1, errores del compilador , pero obtuve más errores. En otras publicaciones descubrí que debería modificar pom.xml, pero no sé cómo. Aquí está mi pom.xml

<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.mycompany</groupId>
  <artifactId>mavenmain</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>mavenmain</name>
    <url>http://maven.apache.org</url>

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

   <dependencies>
     <dependency>
       <groupId>junit</groupId>
        <artifactId>junit</artifactId>
       <version>3.8.1</version>
       <scope>test</scope>
     </dependency>
     <dependency>
        <groupId>gov.nist.math</groupId>
        <artifactId>jama</artifactId>
        <version>1.0.2</version>
     </dependency>
   </dependencies>
 </project>

Sería genial si me puedes ayudar.

MTT
fuente
2
Hora de actualizar la versión de Java.
Sotirios Delimanolis
55
Los genéricos son compatibles con Java 5. Imposible hacer que funcionen antes de esa versión de Java.
Luiggi Mendoza
El valor predeterminado para OpenJDK javac es 1.3, donde para Oracle JDK es 1.5
Thorbjørn Ravn Andersen
¡Ambos anteriores a mí como programador!
CorayThan

Respuestas:

307
<project>
  [...]
  <build>
    [...]
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>(whatever version is current)</version>
        <configuration>
          <!-- or whatever version you use -->
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
    </plugins>
    [...]
  </build>
  [...]
</project>

Vea la página de configuración para el complemento compilador maven:

http://maven.apache.org/plugins/maven-compiler-plugin/examples/set-compiler-source-and-target.html

Ah, y: no use Java 1.3.x, las versiones actuales son Java 1.7.xo 1.8.x

Sean Patrick Floyd
fuente
44
También es posible que desee agregar un cheque en la versión JDK que está utilizando para ejecutar Maven con el complemento Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin . Esto me parece muy conveniente ya que tengo que apoyar diferentes proyectos que están en diferentes versiones de JDK. Evita que compiles con Java 8 en un proyecto Java 7, por ejemplo.
Wim Deblauwe
2
Falta la versión del complemento. No arrojaría un error, pero se recomienda encarecidamente configurar la versión allí. La versión actual es la 3.3
Lukas Werner
1
@LukasWerner tienes razón, por supuesto. pero si agrego una versión, tengo que editar la pregunta cada pocos meses. fue por un compromiso :-)
Sean Patrick Floyd
POR FAVOR aclare ... ¿Qué incluye esta etiqueta <versión> (cualquiera que sea la versión actual) </ versión>? ¿Es algo así como 1.7?
Elijah
2
@Elijah no, esa sería la versión en lenguaje java. Estoy hablando de la versión del complemento. puede encontrarlo a través de este enlace: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd
360

maven-compiler-plugin ya está presente en la dependencia de jerarquía de complementos en pom.xml. Check in POM efectivo.

Para abreviar, puede usar propiedades como esta:

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

Estoy usando maven 3.2.5

leocborges
fuente
¿Qué camino es "mejor"? Esta es menos detallada en comparación con la respuesta seleccionada, pero parece algo oculta. Incluso la documentación del sitio de Maven muestra el uso del complemento.
mkobit
2
@mkobit Supongo que esta es una elección personal. Si necesito configurar algo más además del compilador y la versión de origen, prefiero hacerlo en la sección de complementos.
leocborges
1
Buen punto con el "configurar algo más". Si quiero usar algo como google / propenso a errores , tendría que usar la sección de complementos.
mkobit
55
Este es ahora el primer método en la página de documentación de Maven que dio @mkobit. Mucho mejor, y no tienes que anclar la versión del complemento del compilador.
Danila Piatov
Esto funcionó para mí después de recrear el proyecto en IntelliJ. Tuve que volver a abrir el proyecto en IntelliJ abriendo el archivo pom del proyecto como un nuevo proyecto que supongo que recreó el proyecto.
usuario674669
13

En general, no desea valorar solo la sourceversión ( javac -source 1.8por ejemplo) pero desea valorar tanto sourcela targetversión como la versión ( javac -source 1.8 -target 1.8por ejemplo).
Tenga en cuenta que desde Java 9, tiene una manera de transmitir información y de una manera más sólida para la compatibilidad de compilación cruzada ( javac -release 9).
Maven que envuelve el javaccomando proporciona múltiples formas de transmitir todas estas opciones estándar de JVM.

¿Cómo especificar la versión JDK?

Usar maven-compiler-plugino maven.compiler.source/ maven.compiler.targetpropiedades para especificar sourcey targetson equivalentes.

<plugins>
    <plugin>    
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.8</source>
            <target>1.8</target>
        </configuration>
    </plugin>
</plugins>

y

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

son equivalentes de acuerdo con la documentación de Maven del complemento del compilador ya que <source>los <target>elementos y en la configuración del compilador usan las propiedades maven.compiler.sourcey maven.compiler.targetsi están definidos.

fuente

El -sourceargumento para el compilador de Java.
El valor por defecto es: 1.6.
Propiedad de usuario es: maven.compiler.source.

objetivo

El -targetargumento para el compilador de Java.
El valor por defecto es: 1.6.
Propiedad de usuario es: maven.compiler.target.

Acerca de los valores predeterminados para sourcey target, tenga en cuenta que desde el 3.8.0compilador maven, los valores predeterminados han cambiado de 1.5a1.6 .

Desde el maven-compiler-plugin 3.6 tiene una nueva forma de especificar la versión de Java

Puedes usar el releaseargumento :

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <release>9</release>
    </configuration>
</plugin>

También puede declarar solo la propiedad del usuario maven.compiler.release:

<properties>
    <maven.compiler.release>9</maven.compiler.release>
</properties>

Pero en este momento, la última no será suficiente ya que la maven-compiler-pluginversión predeterminada que usa no se basa en una versión lo suficientemente reciente.

El releaseargumento de Maven transmite release: una nueva opción estándar JVM que podríamos pasar de Java 9:

Compila contra la API pública, compatible y documentada para una versión de VM específica.

De esta manera proporciona una forma estándar para especificar la misma versión para el source, los targety las bootstrapopciones de JVM.
Tenga en cuenta que la especificación de bootstrapes una buena práctica para las compilaciones cruzadas y no le hará daño si tampoco realiza compilaciones cruzadas.

¿Cuál es la mejor manera de especificar la versión JDK?

Para Java 8 y a continuación:

Ni maven.compiler.source/ maven.compiler.targetpropiedades o usar el maven-compiler-plugines mejor. No cambia nada en los hechos, ya que finalmente las dos formas se basan en las mismas propiedades y el mismo mecanismo: el complemento compilador maven core.

Bueno, si no necesita especificar otras propiedades o comportamientos que las versiones de Java en el complemento del compilador, usar este método tiene más sentido ya que es más conciso:

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

Desde Java 9:

El releaseargumento (tercer punto) es una forma de considerar seriamente si desea utilizar la misma versión para el sourcey el target.

davidxxx
fuente
10

Me enfrenté al mismo problema en el proyecto eclipse neon simple maven java

Pero agrego los detalles a continuación dentro del archivo pom.xml

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

Después de hacer clic derecho en proyecto> maven> actualizar proyecto (actualización de fuerza marcada)

Me resuelve mostrar un error en el proyecto

Espero que sea útil

Thansk

Vijay Gajera
fuente
Esto funcionó para mí cuando estaba tratando de construir la aplicación SqlServerSample para el controlador JDBC de Microsoft para SQL Server.
skye --- capitán
0
<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.3</version>
            <configuration>
                <fork>true</fork>
                <source>1.8</source>
                <target>1.8</target>
            </configuration>
        </plugin> 
Sasidhar Reddy
fuente