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.


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


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


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.


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


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> 
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.