Comment spécifiez-vous la version du compilateur Java dans un fichier pom.xml?

252

J'ai écrit un code maven sur les netbeans qui a environ plus de 2000 lignes. Quand je le compile sur netbeans, tout va bien, mais si je veux l'exécuter en ligne de commande, j'obtiendrai 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, des erreurs de compilation , mais j'ai eu plus d'erreurs. J'ai trouvé dans d'autres publications que je devais 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 génial si vous pouviez m'aider.

MTT
la source
2
Il est temps de mettre à niveau la version java.
Sotirios Delimanolis
5
Les génériques sont pris en charge à partir de Java 5. Impossible de les faire fonctionner avant cette version Java.
Luiggi Mendoza
La valeur par défaut pour OpenJDK javac est de 1,3, alors que pour Oracle JDK, elle est de 1,5
Thorbjørn Ravn Andersen
Les deux qui m'ont précédé en tant que programmeur!
CorayThan

Réponses:

308
<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 1.7.x ou 1.8.x

Sean Patrick Floyd
la source
4
Vous pouvez également ajouter une vérification de la version JDK que vous utilisez pour exécuter Maven avec le plug-in Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin. Je trouve cela très pratique car je dois prendre en charge différents projets qui sont sur différentes versions de JDK. Cela évite de compiler avec Java 8 sur un projet Java 7 par exemple.
Wim Deblauwe
2
La version du plugin est manquante. Cela ne générerait pas d'erreur, mais il est fortement recommandé d'y définir la version. La version actuelle est la 3.3
Lukas Werner
1
@LukasWerner, vous avez bien sûr raison. mais si j'ajoute une version, je dois modifier la question tous les quelques mois. a fait un compromis :-)
Sean Patrick Floyd
VEUILLEZ clarifier ... Que contient cette balise <version> (quelle que soit la version actuelle) </version>? Est-ce quelque chose comme 1.7?
Elijah
2
@Elijah non, ce serait la version en langue java. Je parle de la version du plugin. vous pouvez le trouver via ce lien: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd
360

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

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

leocborges
la source
Quelle est la "meilleure"? Celui-ci est moins verbeux par rapport à la réponse sélectionnée, mais il semble en quelque sorte caché. Même la documentation du site Maven montre l'utilisation du plugin.
mkobit
2
@mkobit Je suppose que c'est un choix personnel. Si j'ai besoin de configurer autre chose que le compilateur et la version source, je préfère le faire dans la section plugins.
leocborges
1
Bon point avec le "configurer autre chose". Si je veux utiliser quelque chose comme google / sujette aux erreurs , je devrais utiliser la section plugins.
mkobit
5
C'est maintenant la première méthode sur la page de documentation Maven donnée par @mkobit. Beaucoup plus agréable, et vous n'avez pas à épingler la version du plugin du compilateur.
Danila Piatov
Cela a fonctionné pour moi après avoir recréé le projet dans IntelliJ. J'ai dû rouvrir le projet dans IntelliJ en ouvrant le fichier pom du projet en tant que nouveau projet dont je suppose qu'il a recréé le projet.
user674669
13

Généralement, vous ne voulez pas valoriser uniquement la sourceversion ( javac -source 1.8par exemple) mais vous souhaitez valoriser à la fois la sourceet la targetversion ( javac -source 1.8 -target 1.8par exemple).
Notez qu'à partir de Java 9, vous avez un moyen de transmettre à la fois des informations et d'une manière plus robuste pour la compatibilité de compilation croisée ( javac -release 9).
Maven qui encapsule la javaccommande offre plusieurs façons de transmettre toutes ces options standard JVM.

Comment spécifier la version JDK?

Utiliser les propriétés maven-compiler-pluginou maven.compiler.source/ maven.compiler.targetpour spécifier le sourceet le targetsont équivalents.

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

et

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

sont équivalents selon la documentation Maven du plugin du compilateur puisque <source>les <target>éléments et dans la configuration du compilateur utilisent les propriétés maven.compiler.sourceet maven.compiler.targets'ils sont définis.

la source

L' -sourceargument du compilateur Java.
Valeur par défaut est: 1.6.
Propriété de l' utilisateur est: maven.compiler.source.

cible

L' -targetargument du compilateur Java.
Valeur par défaut est: 1.6.
Propriété de l' utilisateur est: maven.compiler.target.

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

Depuis le plug-in maven-compiler-plugin 3.6, vous avez une nouvelle façon de spécifier la version Java

Vous pouvez utiliser l' releaseargument :

<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é utilisateur maven.compiler.release:

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

Mais pour le moment, la dernière ne suffira pas car la maven-compiler-pluginversion par défaut que vous utilisez ne repose pas sur une version suffisamment récente.

L' releaseargument Maven donne release: une nouvelle option standard JVM que nous pourrions passer de Java 9:

Compile par rapport à l'API publique, prise en charge et documentée pour une version de machine virtuelle spécifique.

De cette façon , fournit un moyen standard pour spécifier la même version pour la source, les targetet les bootstrapoptions de la JVM.
Notez que la spécification de bootstrapest une bonne pratique pour les compilations croisées et que 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 JDK?

Pour Java 8 et versions antérieures:

Ni maven.compiler.source/ maven.compiler.targetproperties, ni l' utilisation de maven-compiler-pluginest mieux. Cela ne change rien dans les 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 core maven.

Eh bien, si vous n'avez pas besoin de spécifier d'autres propriétés ou comportements que les versions Java dans le plugin du compilateur, utiliser cette méthode est plus logique car c'est plus concis:

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

Depuis Java 9:

L' releaseargument (troisième point) est un moyen de bien réfléchir si vous souhaitez utiliser la même version pour le sourceet le target.

davidxxx
la source
10

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

Mais j'ajoute ci-dessous des détails 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> mettre à jour le projet (cocher la mise à jour forcée)

Il me résout d'afficher une erreur sur le projet

J'espère que cela vous sera utile

Thansk

Vijay Gajera
la source
Cela a fonctionné pour moi lorsque j'essayais de créer l'application SqlServerSample pour le pilote Microsoft JDBC pour SQL Server.
skye --- capitaine
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
la source