263 votes

Comment spécifier la version du compilateur Java dans un fichier pom.xml ?

J'ai écrit un code Maven dans Netbeans qui compte environ plus de 2000 lignes. Lorsque je le compile dans Netbeans, tout va bien, mais si je veux l'exécuter en ligne de commande, j'obtiens ces erreurs :

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

J'ai essayé d'utiliser Java 1.3.1, erreurs de compilation mais j'ai eu d'autres erreurs. J'ai trouvé dans d'autres messages que je devrais modifier pom.xml mais je ne sais pas comment. Voici mon 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>

Ce serait formidable si vous pouviez m'aider !

380voto

leocborges Points 4629

maven-compiler-plugin il est déjà présent dans la dépendance de la hiérarchie des plugins dans pom.xml. Vérifiez dans le POM effectif.

Pour faire court, vous pouvez utiliser des propriétés comme celle-ci :

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

J'utilise Maven 3.2.5.

312voto

Sean Patrick Floyd Points 109428
<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>

Voir la page de configuration du plugin du compilateur maven :

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

Oh, et : n'utilisez pas Java 1.3.x, les versions actuelles sont Java 11 ou 17.

23voto

davidh Points 107

En règle générale, vous ne souhaitez pas valoriser uniquement l'élément source version ( javac -source 1.8 par exemple), mais vous souhaitez valoriser à la fois la source et le target version ( javac -source 1.8 -target 1.8 par exemple).
Notez qu'à partir de Java 9, vous disposez d'un moyen de transmettre les deux informations et d'une manière plus robuste pour la compatibilité de compilation croisée ( javac -release 9 ).
Maven qui englobe le javac fournit plusieurs façons de transmettre toutes ces options standard de la JVM.

Comment spécifier la version du JDK ?

Utilisation de maven-compiler-plugin o maven.compiler.source / maven.compiler.target pour spécifier les propriétés source et le target sont équivalentes.

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

sont équivalentes selon la Documentation Maven du plugin de compilation depuis le <source> et le <target> dans la configuration du compilateur utilisent les propriétés maven.compiler.source y maven.compiler.target s'ils sont définis.

source

Le site -source pour le compilateur Java.
La valeur par défaut est : 1.6 .
La propriété de l'utilisateur est : maven.compiler.source .

cible

Le site -target pour le compilateur Java.
La valeur par défaut est : 1.6 .
La propriété de l'utilisateur est : maven.compiler.target .

À propos des valeurs par défaut pour source y target , notez que depuis le 3.8.0 du compilateur maven, les valeurs par défaut sont passées de 1.5 à 1.6 .

<release> nouvelle façon de spécifier la version de Java dans maven-compiler-plugin 3.6

Vous pouvez utiliser le site release argument :

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

Vous pouvez également déclarer uniquement la propriété de l'utilisateur maven.compiler.release :

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

Mais à l'heure actuelle, la dernière ne suffira pas, car la maven-compiler-plugin La version par défaut que vous utilisez ne repose pas sur une version suffisamment récente.

Le Maven release L'argumentation transmet release au compilateur Java pour accéder au Option standard de la JVM nouvellement ajouté à Java 9, JEP 247 : Compiler pour les anciennes versions de la plate-forme .

Compile contre l'API publique, supportée et documentée pour un fichier version VM spécifique.

Cette façon de faire fournit un moyen standard de spécifier la même version pour les éléments suivants source le target et le bootstrap Options de la JVM.
Notez que la spécification de l'option bootstrap est une bonne pratique pour les compilations croisées et cela ne fera pas de mal si vous ne faites pas de compilations croisées non plus.

Quelle est la meilleure façon de spécifier la version du JDK ?

Java 8 et inférieur

Ni l'un ni l'autre maven.compiler.source / maven.compiler.target propriétés ou en utilisant le maven-compiler-plugin est meilleur. Cela ne change rien aux faits puisque finalement les deux façons s'appuient sur les mêmes propriétés et le même mécanisme : le plugin du compilateur maven core.

Si vous n'avez pas besoin de spécifier d'autres propriétés ou comportements que les versions de Java dans le plugin du compilateur, cette méthode est plus logique car elle est plus concise :

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

Java 9 et versions ultérieures

Le site release (troisième point) est une manière de considérer fortement si vous voulez utiliser la même version pour les source et le target .

11voto

Vijay Gajera Points 673

J'ai rencontré le même problème dans eclipse neon simple projet java maven.

Mais j'ai ajouté les détails suivants dans le fichier 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>

Après un clic droit sur le projet > maven > update project (coché force update)

Sa résolution me permet d'afficher une erreur sur le projet

J'espère que cela sera utile

Thansk

2voto

Vous compilez très probablement avec OpenJDK où le javac par défaut, pour une raison quelconque, est Java 1.3 (alors qu'Oracle Java utilise par défaut la version 1.5).

Malheureusement, le maven-compiler-plugin documente que la valeur par défaut est 1.5 (sans dire pourquoi), de sorte que les gens ne définissent généralement pas explicitement les versions source et cible dans leur pom.xml jusqu'à ce qu'ils aient besoin de compiler sous d'autres JVM.

Notez également que si vous voulez être indépendant du JDK, vous pouvez indiquer au plugin maven-compler d'utiliser le compilateur eclipse à la place. Cela vous permet d'exécuter Maven sur un JRE.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X