Jak określić wersję kompilatora Java w pliku pom.xml?

252

Napisałem kod maven na netbeans, który ma około 2000 linii. Kiedy kompiluję go na netbeans, wszystko jest w porządku, ale jeśli chcę uruchomić go z linii poleceń, dostanę te błędy:

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

Próbowałem użyć Java 1.3.1, błędy kompilatora , ale dostałem więcej błędów. Znalazłem z innych postów, że powinienem zmodyfikować pom.xml, ale nie wiem jak. Oto mój 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>

Byłoby wspaniale, gdybyś mógł mi pomóc.

MTT
źródło
2
Czas zaktualizować wersję Java.
Sotirios Delimanolis
5
Generics są obsługiwane z Java 5. Niemożliwe, aby działały przed tą wersją Java.
Luiggi Mendoza
Domyślną wartością dla OpenJDK javac jest 1.3, gdzie dla Oracle JDK jest to 1.5
Thorbjørn Ravn Andersen
Oba poprzedzają mnie jako programisty!
CorayThan,

Odpowiedzi:

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>

Zobacz stronę konfiguracji wtyczki kompilatora maven:

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

Aha: nie używaj Java 1.3.x, aktualne wersje to Java 1.7.x lub 1.8.x

Sean Patrick Floyd
źródło
4
Możesz także dodać kontrolę wersji JDK, której używasz do uruchamiania Maven z wtyczką Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Uważam to za bardzo wygodne, ponieważ muszę wspierać różne projekty, które są w różnych wersjach JDK. Pozwala to uniknąć kompilacji z Javą 8 na przykład w projekcie Java 7.
Wim Deblauwe
2
Brakuje wersji wtyczki. Nie wyrzuciłby błędu, ale zdecydowanie zaleca się ustawienie tam wersji. Obecna wersja to 3.3
Lukas Werner
1
@LukasWerner masz oczywiście rację. ale jeśli dodam wersję, muszę edytować pytanie co kilka miesięcy. poszedł na kompromis :-)
Sean Patrick Floyd
PROSZĘ wyjaśnić ... Co wchodzi w skład tego tagu <wersja> (jakakolwiek wersja jest aktualna) </wersja>? Czy to coś w stylu 1.7?
Eliasz
2
@Elijah nie, to byłaby wersja językowa Java. Mówię o wersji wtyczki. można to znaleźć poprzez ten link: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd
360

maven-compiler-plugin jest już obecny w zależności hierarchii wtyczek w pom.xml. Sprawdź skuteczną POM.

W skrócie możesz użyć takich właściwości:

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

Używam maven 3.2.5

leocborges
źródło
Który sposób jest „najlepszy”? Ten jest mniej gadatliwy w porównaniu do wybranej odpowiedzi, ale wydaje się jakby ukryty. Nawet dokumentacja witryny Maven pokazuje użycie wtyczki.
mkobit
2
@mkobit Chyba jest to osobisty wybór. Jeśli muszę skonfigurować coś innego niż kompilator i wersję źródłową, wolę to zrobić w sekcji wtyczek.
leocborges
1
Dobra uwaga z „skonfiguruj coś innego”. Jeśli chcę użyć czegoś takiego jak Google / podatny na błędy , musiałbym użyć sekcji wtyczek.
mkobit
5
Jest to pierwsza metoda na stronie dokumentacji Maven, którą podał @mkobit. O wiele ładniejszy i nie musisz przypinać wersji wtyczki kompilatora.
Danila Piatov
Działa to dla mnie po odtworzeniu projektu w IntelliJ. Musiałem ponownie otworzyć projekt w IntelliJ, otwierając plik pom projektu jako nowy projekt, który, jak zakładam, odtworzył.
user674669,
13

Zasadniczo nie chcesz wyceniać tylko sourcewersji ( javac -source 1.8na przykład), ale chcesz wycenić zarówno wersję, jak sourcei targetwersję ( javac -source 1.8 -target 1.8na przykład).
Zauważ, że w Javie 9 możesz przekazywać zarówno informacje, jak i bardziej niezawodny sposób na kompatybilność krzyżową ( javac -release 9).
Maven, który otaczajavac polecenie, oferuje wiele sposobów przekazywania wszystkich standardowych opcji JVM.

Jak określić wersję JDK?

Użycie maven-compiler-pluginlub maven.compiler.source/ maven.compiler.targetwłaściwości do określenia sourcei targetsą równoważne.

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

i

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

są równoważne zgodnie z dokumentacją Maven wtyczki kompilatora Ponieważ <source>oraz <target>elementy do wykorzystania konfiguracji kompilator właściwości maven.compiler.sourcei maven.compiler.targetjeśli są zdefiniowane.

źródło

-sourceArgumentem dla kompilatora Javy.
Domyślna wartość to: 1.6.
Użytkownik nie jest właściwość: maven.compiler.source.

cel

-targetArgumentem dla kompilatora Javy.
Domyślna wartość to: 1.6.
Użytkownik nie jest właściwość: maven.compiler.target.

Informacje o wartościach domyślnych dla sourcei targetzwróć uwagę, że od 3.8.0kompilatora maven wartości domyślne zmieniły się z 1.5na1.6 .

Z maven-compiler-plugin 3.6 masz nowy sposób na określenie wersji Java

Można użyć do releaseargumentu :

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

Możesz także zadeklarować tylko właściwość użytkownika maven.compiler.release:

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

Ale w tej chwili ta ostatnia nie wystarczy, ponieważ maven-compiler-pluginużywana wersja domyślna nie opiera się na wystarczająco nowej wersji.

releaseArgument Maven przekazuje release: nową standardową opcję JVM , którą moglibyśmy przekazać z Java 9:

Kompiluje z publicznym, obsługiwanym i udokumentowanym API dla konkretnej wersji maszyny wirtualnej.

Ten sposób zapewnia standardowy sposób określenia tej samej wersji dla opcji source, targeti bootstrapJVM.
Zauważ, że określenie bootstrapjest dobrą praktyką dla kompilacji krzyżowych i nie zaszkodzi, jeśli nie wykonasz kompilacji krzyżowych.

Jaki jest najlepszy sposób na określenie wersji JDK?

Dla Java 8 i niższych:

Ani maven.compiler.source/ maven.compiler.targetwłaściwości ani korzystanie z nich nie maven-compiler-pluginjest lepsze. Nic nie zmienia faktów, ponieważ w końcu dwa sposoby polegają na tych samych właściwościach i tym samym mechanizmie: wtyczka kompilatora core maven.

Cóż, jeśli nie musisz określać innych właściwości lub zachowania niż wersje Java we wtyczce kompilatora, użycie tego sposobu ma większy sens, ponieważ jest bardziej zwięzłe:

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

Z Java 9:

releaseArgument (trzeci punkt) jest sposobem, aby poważnie rozważyć, jeśli chcesz używać tej samej wersji dla sourcea target.

davidxxx
źródło
10

Ten sam problem spotkałem w projekcie Java Simple Eclipse Neon Maven

Ale dodaję poniżej szczegóły w pliku 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>

Po kliknięciu prawym przyciskiem myszy projektu> maven> zaktualizuj projekt (zaznaczone wymuś aktualizację)

Rozwiązuje mnie wyświetlanie błędu w projekcie

Mam nadzieję, że to pomoże

Thansk

Vijay Gajera
źródło
Działa to dla mnie, gdy próbowałem zbudować aplikację SqlServerSample dla sterownika Microsoft JDBC dla programu SQL Server.
skye --- kapitan
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
źródło