Wie geben Sie die Java-Compilerversion in einer pom.xml-Datei an?

252

Ich habe einen Maven-Code für Netbeans geschrieben, der ungefähr mehr als 2000 Zeilen enthält. Wenn ich es auf NetBeans kompiliere, ist alles in Ordnung, aber wenn ich es über die Befehlszeile ausführen möchte, werden folgende Fehler angezeigt:

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

Ich habe versucht, Java 1.3.1 zu verwenden, Compilerfehler , aber ich habe mehr Fehler bekommen. Ich habe aus anderen Posts herausgefunden, dass ich pom.xml ändern sollte, aber ich weiß nicht wie. Hier ist meine 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>

Es wäre toll, wenn Sie mir helfen könnten.

MTT
quelle
2
Zeit für ein Upgrade der Java-Version.
Sotirios Delimanolis
5
Generika werden von Java 5 unterstützt. Es ist unmöglich, sie vor dieser Java-Version zum Laufen zu bringen.
Luiggi Mendoza
Der Standardwert für OpenJDK Javac ist 1.3, für Oracle JDK ist es 1.5
Thorbjørn Ravn Andersen
Beide sind älter als ich als Programmierer!
CorayThan

Antworten:

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>

Auf der Konfigurationsseite finden Sie das Maven-Compiler-Plugin:

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

Oh, und: Verwenden Sie kein Java 1.3.x, aktuelle Versionen sind Java 1.7.x oder 1.8.x.

Sean Patrick Floyd
quelle
4
Vielleicht möchten Sie auch die JDK-Version überprüfen, mit der Sie Maven mit dem Maven Enforcer-Plugin ausführen : maven.apache.org/enforcer/maven-enforcer-plugin Ich finde das sehr praktisch, da ich verschiedene Projekte unterstützen muss, die sind auf verschiedenen JDK-Versionen. Es wird vermieden, dass Sie beispielsweise mit Java 8 in einem Java 7-Projekt kompilieren.
Wim Deblauwe
2
Die Plugin-Version fehlt. Es würde keinen Fehler auslösen, aber es wird dringend empfohlen, die Version dort einzustellen. Die aktuelle Version ist 3.3
Lukas Werner
1
@LukasWerner du hast natürlich recht. Wenn ich jedoch eine Version hinzufüge, muss ich die Frage alle paar Monate bearbeiten. ging für einen Kompromiss :-)
Sean Patrick Floyd
BITTE klären ... Was steckt in diesem Tag <Version> (welche Version auch immer aktuell ist) </ Version>? Ist es so etwas wie 1.7?
Elijah
2
@ Elijah nein, das wäre die Java-Sprachversion. Ich spreche von der Plugin-Version. Sie finden das über diesen Link: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd
360

maven-compiler-plugin ist bereits in der Abhängigkeit der Plugins-Hierarchie in pom.xml vorhanden. Checken Sie das effektive POM ein.

Kurz gesagt, Sie können Eigenschaften wie diese verwenden:

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

Ich benutze Maven 3.2.5

leocborges
quelle
Welcher Weg ist "am besten"? Dieser ist im Vergleich zur ausgewählten Antwort weniger ausführlich, scheint aber irgendwie verborgen zu sein. Sogar die Maven- Site-Dokumentation zeigt die Verwendung des Plugins.
mkobit
2
@mkobit Ich denke, das ist eine persönliche Entscheidung. Wenn ich neben dem Compiler und der Quellversion noch etwas anderes konfigurieren muss, bevorzuge ich dies im Abschnitt Plugins.
Leocborges
1
Guter Punkt mit dem "etwas anderes konfigurieren". Wenn ich etwas wie Google / Fehleranfällig verwenden möchte, müsste ich den Abschnitt Plugins verwenden.
mkobit
5
Dies ist jetzt die erste Methode auf der Maven-Dokumentationsseite, die @mkobit angegeben hat. Viel schöner, und Sie müssen die Version des Compiler-Plugins nicht anheften.
Danila Piatov
Dies funktionierte für mich, nachdem ich das Projekt in IntelliJ neu erstellt hatte. Ich musste das Projekt in IntelliJ erneut öffnen, indem ich die POM-Datei des Projekts als neues Projekt öffnete, von dem ich annehme, dass es das Projekt neu erstellt hat.
user674669
13

Im Allgemeinen möchten Sie nicht nur die sourceVersion ( javac -source 1.8zum Beispiel) bewerten, sondern sowohl die sourceals auch die targetVersion ( javac -source 1.8 -target 1.8zum Beispiel).
Beachten Sie, dass Sie ab Java 9 sowohl Informationen als auch eine robustere Methode für die Kompatibilität zwischen Kompilierungen ( javac -release 9) bereitstellen können .
Maven, der den javacBefehl umschließt, bietet mehrere Möglichkeiten, alle diese JVM-Standardoptionen zu übermitteln.

Wie gebe ich die JDK-Version an?

Verwenden von maven-compiler-pluginoder maven.compiler.source/ maven.compiler.targetEigenschaften, um die sourceund die targetsind äquivalent.

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

und

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

sind gemäß der Maven-Dokumentation des Compiler-Plugins äquivalent, da die <source>und die <target>Elemente in der Compilerkonfiguration die Eigenschaften verwenden maven.compiler.sourceund maven.compiler.targetob sie definiert sind.

Quelle

Das -sourceArgument für den Java-Compiler.
Der Standardwert ist : 1.6.
Benutzereigenschaft ist : maven.compiler.source.

Ziel

Das -targetArgument für den Java-Compiler.
Der Standardwert ist : 1.6.
Benutzereigenschaft ist : maven.compiler.target.

Informationen zu den Standardwerten für sourceund targetBeachten Sie, dass sich die Standardwerte seit 3.8.0dem Maven-Compiler von 1.5bis geändert haben1.6 .

Ab dem Maven-Compiler-Plugin 3.6 haben Sie eine neue Möglichkeit, die Java-Version anzugeben

Sie können das releaseArgument verwenden :

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

Sie können auch nur die Benutzereigenschaft deklarieren maven.compiler.release:

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

Aber zu diesem Zeitpunkt wird der letzte nicht ausreichen maven-compiler-plugin Version jedoch nicht Ihnen verwendete Standardversion nicht auf einer ausreichend aktuellen Version basiert.

Das Maven- releaseArgument vermittelt release: eine neue JVM-Standardoption , die wir von Java 9 übergeben könnten:

Kompiliert gegen die öffentliche, unterstützte und dokumentierte API für eine bestimmte VM-Version.

Auf diese Weise bietet einen Standard - Weg , um die gleiche Version für den angeben source, die targetund die bootstrapJVM - Optionen.
Beachten Sie, dass die Angabe von bootstrapeine gute Vorgehensweise für Cross-Compilations ist und nicht schadet, wenn Sie auch keine Cross-Compilations durchführen.

Wie kann die JDK-Version am besten angegeben werden?

Für Java 8 und niedriger:

Weder maven.compiler.source/ maven.compiler.targetEigenschaften noch die Verwendung der maven-compiler-pluginist besser. Es ändert nichts an den Fakten, da schließlich die beiden Möglichkeiten auf denselben Eigenschaften und demselben Mechanismus beruhen: dem Maven-Core-Compiler-Plugin.

Wenn Sie im Compiler-Plugin keine anderen Eigenschaften oder Verhaltensweisen als Java-Versionen angeben müssen, ist die Verwendung dieser Methode sinnvoller, da dies prägnanter ist:

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

Aus Java 9:

Das releaseArgument (dritter Punkt) ist eine Möglichkeit, stark zu überlegen, ob Sie dieselbe Version für das sourceund das verwenden möchten target.

davidxxx
quelle
10

Ich hatte das gleiche Problem im Eclipse Neon Simple Maven Java-Projekt

Aber ich füge unten Details in der Datei pom.xml hinzu

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

Klicken Sie nach der rechten Maustaste auf Projekt> Maven> Projekt aktualisieren (aktiviertes Update erzwingen).

Es ist meine Lösung, Fehler im Projekt anzuzeigen

Hoffe es wird hilfreich sein

Thansk

Vijay Gajera
quelle
Dies funktionierte für mich, als ich versuchte, die SqlServerSample-App für den Microsoft JDBC-Treiber für SQL Server zu erstellen.
Skye --- Kapitä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
quelle