คุณระบุเวอร์ชันคอมไพเลอร์ Java ในไฟล์ pom.xml อย่างไร


252

ฉันเขียนโค้ด maven บน netbeans ที่มีประมาณ 2,000 บรรทัดขึ้นไป เมื่อฉันรวบรวมมันบน netbeans ทุกอย่างใช้ได้ แต่ถ้าฉันต้องการเรียกใช้บนบรรทัดคำสั่งฉันจะได้รับข้อผิดพลาดเหล่านี้:

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

ฉันพยายามใช้Java 1.3.1 ข้อผิดพลาดของคอมไพเลอร์แต่ฉันมีข้อผิดพลาดเพิ่มเติม ฉันพบจากโพสต์อื่น ๆ ที่ฉันควรแก้ไข pom.xml แต่ฉันไม่ทราบวิธี นี่คือ 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>

คงจะดีถ้าคุณช่วยฉันได้


2
ได้เวลาอัพเกรดจาวาเวอร์ชั่นแล้ว
Sotirios Delimanolis

5
Generics ได้รับการสนับสนุนจาก Java 5 เป็นไปไม่ได้ที่จะทำให้มันทำงานก่อนรุ่น Java
Luiggi Mendoza

ค่าเริ่มต้นสำหรับ OpenJDK javac คือ 1.3 โดยที่ Oracle JDK คือ 1.5
Thorbjørn Ravn Andersen

ซึ่งทั้งสองอย่างลงวันที่ก่อนหน้าฉันเป็นโปรแกรมเมอร์!
CorayThan

คำตอบ:


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>

ดูหน้าการตั้งค่าสำหรับปลั๊กอินคอมไพเลอร์ maven:

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

โอ้และ: อย่าใช้ Java 1.3.x เวอร์ชันปัจจุบันคือ Java 1.7.x หรือ 1.8.x


4
คุณอาจต้องการเพิ่มการตรวจสอบเวอร์ชั่น JDK ที่คุณใช้เพื่อเรียกใช้ Maven ด้วย Maven Enforcer Plugin: maven.apache.org/enforcer/maven-enforcer-pluginฉันพบว่ามันสะดวกมากเพราะฉันต้องสนับสนุนโครงการต่าง ๆ ที่ อยู่ในรุ่น JDK ที่แตกต่างกัน หลีกเลี่ยงการที่คุณคอมไพล์ด้วย Java 8 บนโปรเจ็กต์ Java 7
Wim Deblauwe

2
เวอร์ชันปลั๊กอินหายไป มันจะไม่เกิดข้อผิดพลาด แต่ขอแนะนำอย่างยิ่งให้ตั้งค่ารุ่นนั้น รุ่นปัจจุบันคือ 3.3
Lukas Werner

1
@ LukasWerner คุณพูดถูก แต่ถ้าฉันเพิ่มเวอร์ชันฉันต้องแก้ไขคำถามทุกสองสามเดือน ไปเพื่อการประนีประนอม :-)
Sean Patrick Floyd

โปรดอธิบาย ... สิ่งที่จะเข้าสู่แท็กนี้ <version> (เวอร์ชันใดที่เป็นปัจจุบัน) </version>? มันเป็นเช่น 1.7 หรือไม่?
เอลียาห์

2
@Elijah ไม่นั่นเป็นเวอร์ชั่นภาษาจาวา ฉันกำลังพูดถึงรุ่นปลั๊กอิน คุณสามารถค้นหาได้ผ่านลิงค์นี้: mvnrepository.com/artifact/org.apache.maven.plugins/ …
Sean Patrick Floyd

360

maven-compiler-pluginมันมีอยู่แล้วในการพึ่งพาลำดับชั้นของปลั๊กอินใน pom.xml ตรวจสอบ POM ที่มีประสิทธิภาพ

ในระยะสั้นคุณสามารถใช้คุณสมบัติเช่นนี้:

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

ฉันใช้ maven 3.2.5


วิธีไหน "ดีที่สุด" อันนี้น้อยมากเมื่อเทียบกับคำตอบที่เลือก แต่ดูเหมือนจะซ่อนอยู่ แม้แต่เอกสารไซต์ Maven ก็ยังแสดงการใช้งานปลั๊กอิน
mkobit

2
@ mkobit ฉันเดาว่านี่เป็นตัวเลือกส่วนบุคคล หากฉันต้องการกำหนดค่าอย่างอื่นนอกเหนือจากคอมไพเลอร์และเวอร์ชั่นต้นฉบับฉันชอบที่จะทำในส่วนปลั๊กอิน
leocborges

1
ข้อดีคือมี "กำหนดค่าอย่างอื่น" หากฉันต้องการใช้google / ข้อผิดพลาดได้ง่ายฉันจะต้องใช้ส่วนของปลั๊กอิน
mkobit

5
นี่เป็นวิธีแรกในหน้าเอกสาร Maven ที่ @mkobit มอบให้ ดีกว่ามากและคุณไม่จำเป็นต้องตรึงเวอร์ชันของปลั๊กอินคอมไพเลอร์
Danila Piatov

สิ่งนี้ใช้ได้กับฉันหลังจากฉันสร้างโครงการขึ้นใหม่ใน IntelliJ ฉันต้องเปิดโครงการใน IntelliJ อีกครั้งโดยเปิดไฟล์ pom ของโครงการเป็นโครงการใหม่ซึ่งฉันคิดว่าจะสร้างโครงการขึ้นมาใหม่
user674669

13

โดยทั่วไปคุณไม่ต้องการที่จะคุ้มค่าเพียงsourceรุ่น ( javac -source 1.8ตัวอย่าง) แต่คุณต้องการที่จะคุ้มค่าทั้งในsourceและtargetรุ่น ( javac -source 1.8 -target 1.8ตัวอย่าง)
โปรดทราบว่าจาก Java 9 คุณมีวิธีการถ่ายทอดข้อมูลทั้งสองและวิธีที่มีประสิทธิภาพมากขึ้นสำหรับความเข้ากันได้ข้ามการรวบรวม ( javac -release 9)
Maven ที่ล้อมรอบjavacคำสั่งมีหลายวิธีในการถ่ายทอดตัวเลือกมาตรฐาน JVM เหล่านี้ทั้งหมด

จะระบุเวอร์ชั่นของ JDK ได้อย่างไร?

การใช้maven-compiler-pluginหรือmaven.compiler.source/ maven.compiler.targetคุณสมบัติเพื่อระบุsourceและtargetจะเทียบเท่า

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

และ

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

เทียบเท่าตามเอกสาร Maven ของปลั๊กอินคอมไพเลอร์ เนื่องจาก<source>และ<target>องค์ประกอบในการกำหนดค่าคอมไพเลอร์ใช้คุณสมบัติmaven.compiler.sourceและmaven.compiler.targetหากมีการกำหนดไว้

แหล่ง

-sourceอาร์กิวเมนต์สำหรับการคอมไพเลอร์ Java ค่าเริ่มต้นคือ
สถานที่ให้บริการผู้ใช้: 1.6
maven.compiler.source

เป้า

-targetอาร์กิวเมนต์สำหรับการคอมไพเลอร์ Java ค่าเริ่มต้นคือ
สถานที่ให้บริการผู้ใช้: 1.6
maven.compiler.target

เกี่ยวกับค่าเริ่มต้นสำหรับการsourceและ targetทราบว่า ตั้งแต่3.8.0ของคอมไพเลอร์ Maven ค่าเริ่มต้นที่มีการเปลี่ยนแปลงจาก1.51.6การ

จาก maven-compiler-plugin 3.6 คุณมีวิธีใหม่ในการระบุเวอร์ชัน Java

คุณสามารถใช้อาร์กิวเมนต์ :release

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

คุณสามารถประกาศเฉพาะคุณสมบัติของผู้ใช้maven.compiler.release:

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

แต่ในเวลานี้อันสุดท้ายจะไม่เพียงพอเนื่องจากmaven-compiler-pluginเวอร์ชันเริ่มต้นที่คุณใช้ไม่พึ่งพาเวอร์ชันที่เพียงพอล่าสุด

releaseอาร์กิวเมนต์Maven บ่งบอกถึง release: ตัวเลือกมาตรฐาน JVM ใหม่ที่เราสามารถผ่านจาก Java 9:

คอมไพล์ต่อต้าน API สาธารณะที่ได้รับการสนับสนุนและจัดทำเป็นเอกสารสำหรับ VM รุ่นที่ระบุ

วิธีนี้จัดเตรียมวิธีมาตรฐานในการระบุเวอร์ชันเดียวกันสำหรับตัวเลือกsourcethe targetและbootstrapJVM
โปรดทราบว่าการระบุbootstrapเป็นวิธีปฏิบัติที่ดีสำหรับการรวบรวมข้ามและจะไม่เจ็บถ้าคุณไม่ได้ทำการรวบรวมข้ามเช่นกัน

วิธีใดดีที่สุดในการระบุรุ่น JDK

สำหรับ Java 8 และต่ำกว่า:

ทั้งคุณสมบัติmaven.compiler.source/ หรือการใช้ดีกว่า มันไม่มีอะไรเปลี่ยนแปลงในข้อเท็จจริงเนื่องจากในที่สุดทั้งสองวิธีจะใช้คุณสมบัติเดียวกันและกลไกเดียวกันนั่นคือปลั๊กอินคอมไพเลอร์ maven core maven.compiler.targetmaven-compiler-plugin

ถ้าคุณไม่จำเป็นต้องระบุคุณสมบัติหรือลักษณะการทำงานอื่นนอกเหนือจาก Java เวอร์ชันในปลั๊กอินคอมไพเลอร์การใช้วิธีนี้เหมาะสมกว่าเนื่องจากมีความกระชับมากกว่านี้:

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

จาก Java 9:

releaseอาร์กิวเมนต์ (จุดที่สาม) เป็นวิธีการที่จะต้องพิจารณาอย่างยิ่งถ้าคุณต้องการที่จะใช้รุ่นเดียวกันสำหรับการและ sourcetarget


10

ฉันประสบปัญหาเดียวกันใน eclipse Neon simple maven project java

แต่ฉันจะเพิ่มรายละเอียดด้านล่างในไฟล์ 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>

หลังจากคลิกขวาที่โปรเจ็กต์> maven> อัพเดตโปรเจ็กต์ (กาเลือกกำลังอัพเดต)

แก้ไขฉันเพื่อแสดงข้อผิดพลาดในโครงการ

หวังว่ามันจะเป็นประโยชน์

Thansk


สิ่งนี้ใช้ได้กับฉันเมื่อฉันพยายามสร้างแอป SqlServerSample สำหรับ Microsoft JDBC Driver สำหรับ SQL Server
skye --- กัปตัน

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> 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.