Bagaimana Anda menentukan versi Java compiler dalam file pom.xml?

252

Saya menulis kode pakar pada netbeans yang memiliki sekitar lebih dari 2000 baris. Ketika saya mengompilasinya di netbeans, semuanya baik-baik saja, tetapi jika saya ingin menjalankannya di command line, saya akan mendapatkan kesalahan ini:

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

Saya mencoba menggunakan Java 1.3.1, kesalahan kompiler , tetapi saya mendapat lebih banyak kesalahan. Saya menemukan dari posting lain bahwa saya harus memodifikasi pom.xml, tetapi saya tidak tahu caranya. Ini pom.xml saya

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

Akan lebih bagus jika Anda dapat membantu saya.

MTT
sumber
2
Saatnya untuk meningkatkan versi java.
Sotirios Delimanolis
5
Generik didukung dari Java 5. Mustahil untuk membuatnya berfungsi sebelum versi Java itu.
Luiggi Mendoza
Default untuk OpenJDK javac adalah 1.3, di mana untuk Oracle JDK adalah 1.5
Thorbjørn Ravn Andersen
Keduanya sebelum saya menjadi seorang programmer!
CorayThan

Jawaban:

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>

Lihat halaman konfigurasi untuk plugin compiler maven:

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

Oh, dan: jangan gunakan Java 1.3.x, versi saat ini adalah Java 1.7.x atau 1.8.x

Sean Patrick Floyd
sumber
4
Anda juga mungkin ingin menambahkan tanda centang pada versi JDK yang Anda gunakan untuk menjalankan Maven dengan Plugin Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Saya merasa ini sangat nyaman karena saya harus mendukung berbagai proyek yang ada di versi JDK yang berbeda. Misalnya, Anda menghindari kompilasi dengan Java 8 pada proyek Java 7.
Wim Deblauwe
2
Versi plugin tidak ada. Itu tidak akan menimbulkan kesalahan tetapi sangat disarankan, untuk mengatur versi di sana. Versi saat ini adalah 3.3
Lukas Werner
1
@LukasWerner Anda benar tentu saja. tetapi jika saya menambahkan versi saya harus mengedit pertanyaan setiap beberapa bulan. pergi untuk kompromi :-)
Sean Patrick Floyd
HARAP diklarifikasi ... Apa yang masuk ke tag ini <version> (versi apa pun saat ini) </version>? Apakah itu seperti 1,7?
Elia
2
@ Elia tidak, itu akan menjadi versi bahasa java. Saya berbicara tentang versi plugin. Anda dapat menemukannya melalui tautan ini: mvnrepository.com/artifact/org.apache.maven.plugins/…
Sean Patrick Floyd
360

maven-compiler-plugin itu sudah ada dalam dependensi hierarki plugin di pom.xml. Periksa di POM Efektif.

Singkatnya, Anda dapat menggunakan properti seperti ini:

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

Saya menggunakan pakar 3.2.5

leocborges
sumber
Jalan mana yang "terbaik"? Yang ini kurang verbose dibandingkan dengan jawaban yang dipilih, tetapi sepertinya agak tersembunyi. Bahkan dokumentasi situs Maven menunjukkan menggunakan plugin.
mkobit
2
@ mkobit Saya kira ini pilihan pribadi. Jika saya perlu mengkonfigurasi sesuatu yang lain selain versi kompiler dan sumber saya lebih suka melakukannya di bagian plugins.
leocborges
1
Poin bagus dengan "konfigurasi sesuatu yang lain". Jika saya ingin menggunakan sesuatu seperti google / rawan kesalahan , saya harus menggunakan cara bagian plugin.
mkobit
5
Ini sekarang metode pertama pada halaman dokumentasi Maven yang diberikan @mkobit. Jauh lebih bagus, dan Anda tidak perlu menyematkan versi plugin kompiler.
Danila Piatov
Ini bekerja untuk saya setelah saya membuat ulang proyek di IntelliJ. Saya harus membuka kembali proyek di IntelliJ dengan membuka file pom proyek sebagai proyek baru yang saya asumsikan menciptakan kembali proyek.
user674669
13

Umumnya Anda tidak ingin menilai hanya sourceversi ( javac -source 1.8misalnya) tetapi Anda ingin menghargai versi sourcedan targetversi ( javac -source 1.8 -target 1.8misalnya).
Perhatikan bahwa dari Java 9, Anda memiliki cara untuk menyampaikan informasi dan cara yang lebih kuat untuk kompatibilitas lintas-kompilasi ( javac -release 9).
Maven yang membungkus javacperintah menyediakan banyak cara untuk menyampaikan semua opsi standar JVM ini.

Bagaimana cara menentukan versi JDK?

Menggunakan maven-compiler-pluginatau maven.compiler.source/ maven.compiler.targetproperti untuk menentukan sourcedan targetsetara.

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

dan

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

ekuivalen menurut dokumentasi Maven dari plugin kompiler karena <source>dan <target>elemen - elemen dalam konfigurasi kompiler menggunakan properti maven.compiler.sourcedan maven.compiler.targetjika didefinisikan.

sumber

The -sourceargumen untuk compiler Java.
Nilai default adalah: 1.6.
Properti pengguna adalah: maven.compiler.source.

target

The -targetargumen untuk compiler Java.
Nilai default adalah: 1.6.
Properti pengguna adalah: maven.compiler.target.

Tentang nilai default untuk sourcedan target, perhatikan bahwa sejak 3.8.0kompiler pakar, nilai default telah berubah dari 1.5menjadi1.6 .

Dari maven-compiler-plugin 3.6 Anda memiliki cara baru untuk menentukan versi Java

Anda dapat menggunakan ini releaseargumen :

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

Anda juga dapat mendeklarasikan hanya properti pengguna maven.compiler.release:

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

Tetapi pada saat ini yang terakhir tidak akan cukup karena maven-compiler-pluginversi default yang Anda gunakan tidak bergantung pada versi yang cukup baru.

releaseArgumen Maven menyampaikan release: opsi standar JVM baru yang bisa kita lewati dari Java 9:

Mengkompilasi terhadap API publik, yang didukung dan didokumentasikan untuk versi VM tertentu.

Cara ini menyediakan cara standar untuk menentukan versi yang sama untuk opsi source, targetdan bootstrapJVM.
Perhatikan bahwa menentukan itu bootstrapadalah praktik yang baik untuk kompilasi silang dan tidak akan sakit jika Anda tidak membuat kompilasi silang juga.

Mana cara terbaik untuk menentukan versi JDK?

Untuk Java 8 dan di bawah ini:

Baik maven.compiler.source/ maven.compiler.targetproperti atau menggunakan maven-compiler-pluginlebih baik. Tidak ada perubahan dalam fakta karena akhirnya dua cara bergantung pada sifat yang sama dan mekanisme yang sama: plugin compiler maven core.

Nah, jika Anda tidak perlu menentukan properti atau perilaku lain selain versi Java di plugin kompiler, menggunakan cara ini lebih masuk akal karena ini lebih ringkas:

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

Dari Jawa 9:

The releaseargumen (titik ketiga) adalah cara untuk sangat mempertimbangkan jika Anda ingin menggunakan versi yang sama untuk sourcedan target.

davidxxx
sumber
10

Saya menghadapi masalah yang sama dalam proyek java java sederhana gerhana neon

Tapi saya menambahkan detail di bawah ini di dalam file 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>

Setelah klik kanan pada proyek> maven> perbarui proyek (pembaruan kekuatan yang dicentang)

Memutuskan saya untuk menampilkan kesalahan pada proyek

Semoga bermanfaat

Bahasa thans

Vijay Gajera
sumber
Ini bekerja untuk saya ketika saya mencoba untuk membangun aplikasi SqlServerSample untuk Microsoft JDBC Driver untuk SQL Server.
skye --- kapten
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
sumber