Làm thế nào để bạn chỉ định phiên bản trình biên dịch Java trong tệp pom.xml?


252

Tôi đã viết một mã maven trên netbeans có khoảng hơn 2000 dòng. Khi tôi biên dịch nó trên netbeans, mọi thứ đều ổn, nhưng nếu tôi muốn chạy nó trên dòng lệnh, tôi sẽ gặp các lỗi sau:

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

Tôi đã thử sử dụng Java 1.3.1, lỗi trình biên dịch , nhưng tôi gặp nhiều lỗi hơn. Tôi đã tìm thấy từ các bài đăng khác rằng tôi nên sửa đổi pom.xml, nhưng tôi không biết làm thế nào. Đây là pom.xml của tôi

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

Sẽ thật tuyệt nếu bạn có thể giúp tôi.


2
Thời gian nâng cấp phiên bản java.
Sotirios Delimanolis

5
Generics được hỗ trợ từ Java 5. Không thể làm cho chúng hoạt động trước phiên bản Java đó.
Luiggi Mendoza

Mặc định cho OpenJDK javac là 1.3, trong đó đối với Oracle JDK là 1.5
Thorbjørn Ravn Andersen

Cả hai đều có trước tôi là một lập trình viên!
CorayThan

Câu trả lời:


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>

Xem trang cấu hình cho plugin trình biên dịch maven:

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

Ồ, và: không sử dụng Java 1.3.x, các phiên bản hiện tại là Java 1.7.x hoặc 1.8.x


4
Bạn cũng có thể muốn thêm một kiểm tra vào phiên bản JDK mà bạn đang sử dụng để chạy Maven với Plugin Maven Enforcer: maven.apache.org/enforcer/maven-enforcer-plugin Tôi thấy điều này rất thuận tiện vì tôi phải hỗ trợ các dự án khác nhau. là trên các phiên bản JDK khác nhau. Nó tránh việc bạn biên dịch với Java 8 trên một dự án Java 7 chẳng hạn.
Wim Deblauwe

2
Phiên bản plugin bị thiếu. Nó sẽ không gây ra lỗi nhưng chúng tôi khuyên bạn nên đặt phiên bản ở đó. Phiên bản hiện tại là 3.3
Lukas Werner

1
@LukasWerner bạn đúng tất nhiên. nhưng nếu tôi thêm một phiên bản, tôi phải chỉnh sửa câu hỏi vài tháng một lần. đã thỏa hiệp :-)
Sean Patrick Floyd

XIN VUI LÒNG làm rõ ... Điều gì đi vào thẻ này <phiên bản> (bất kỳ phiên bản nào là hiện tại) </ version>? Nó có giống như 1.7 không?
Ê-li

2
@Elijah không, đó sẽ là phiên bản ngôn ngữ java. Tôi đang nói về phiên bản plugin. bạn có thể tìm thấy điều đó thông qua liên kết này: mvnreposective.com/artifact/org.apache.maven.plugins/ mẹo
Sean Patrick Floyd

360

maven-biên dịch-plugin đã có trong phần phụ thuộc phân cấp của plugin trong pom.xml. Kiểm tra POM hiệu quả.

Nói ngắn gọn, bạn có thể sử dụng các thuộc tính như thế này:

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

Tôi đang sử dụng maven 3.2.5


Cách nào là "tốt nhất"? Câu hỏi này ít dài dòng hơn so với câu trả lời đã chọn, nhưng có vẻ như nó bị ẩn đi. Ngay cả tài liệu trang web Maven cho thấy bằng cách sử dụng plugin.
mkobit

2
@mkobit Tôi đoán đây là một lựa chọn cá nhân. Nếu tôi cần cấu hình một cái gì đó khác ngoài trình biên dịch và phiên bản nguồn, tôi thích làm điều đó trong phần bổ trợ.
leocborges

1
Điểm tốt với "cấu hình một cái gì đó khác". Nếu tôi muốn sử dụng một cái gì đó như google / dễ bị lỗi , tôi sẽ phải sử dụng cách phần bổ trợ.
mkobit

5
Đây hiện là phương pháp đầu tiên trên trang tài liệu Maven mà @mkobit đưa ra. Đẹp hơn nhiều và bạn không phải ghim phiên bản của trình biên dịch.
Danila Piatov

Điều này làm việc cho tôi sau khi tôi tạo lại dự án trong IntelliJ. Tôi đã phải mở lại dự án trong IntelliJ bằng cách mở tệp pom của dự án như một dự án mới mà tôi giả định đã tạo lại dự án.
dùng674669

13

Nói chung, bạn không muốn chỉ định giá sourcephiên bản ( javac -source 1.8ví dụ) nhưng bạn muốn định giá cả phiên bản sourcetargetphiên bản ( javac -source 1.8 -target 1.8ví dụ).
Lưu ý rằng từ Java 9, bạn có cách truyền tải cả thông tin và theo cách mạnh mẽ hơn để tương thích biên dịch chéo ( javac -release 9).
Maven bao bọc javaclệnh cung cấp nhiều cách để truyền đạt tất cả các tùy chọn tiêu chuẩn JVM này.

Làm thế nào để xác định phiên bản JDK?

Sử dụng maven-compiler-pluginhoặc maven.compiler.source/ maven.compiler.targetthuộc tính để chỉ định sourcetargettương đương.

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

tương đương theo tài liệu Maven của plugin trình biên dịch<source>và các <target>thành phần trong cấu hình trình biên dịch sử dụng các thuộc tính maven.compiler.sourcemaven.compiler.targetnếu chúng được xác định.

nguồn

Đối -sourcesố cho trình biên dịch Java.
Giá trị mặc định là : 1.6.
Tài sản người dùng là : maven.compiler.source.

Mục tiêu

Đối -targetsố cho trình biên dịch Java.
Giá trị mặc định là : 1.6.
Tài sản người dùng là : maven.compiler.target.

Về các giá trị mặc định cho sourcetarget, lưu ý rằng kể từ 3.8.0trình biên dịch maven, các giá trị mặc định đã thay đổi từ 1.5thành1.6 .

Từ maven-Trình biên dịch-plugin 3.6, bạn có một cách mới để chỉ định phiên bản Java

Bạn có thể sử dụng các releaselập luận :

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

Bạn cũng có thể khai báo chỉ thuộc tính người dùng maven.compiler.release:

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

Nhưng tại thời điểm này, phiên bản cuối cùng sẽ không đủ vì maven-compiler-pluginphiên bản mặc định bạn sử dụng không dựa vào phiên bản đủ gần đây.

Đối releasesố Maven truyền tải release: một tùy chọn tiêu chuẩn JVM mới mà chúng ta có thể chuyển từ Java 9:

Biên dịch dựa trên API công khai, được hỗ trợ và ghi lại cho một phiên bản VM cụ thể.

Bằng cách này cung cấp một cách tiêu chuẩn để xác định các phiên bản tương tự cho các source, các targetvà các bootstraptùy chọn JVM.
Lưu ý rằng việc chỉ định bootstraplà một cách thực hành tốt cho các phần tổng hợp chéo và nó sẽ không bị tổn thương nếu bạn không thực hiện các phần tổng hợp chéo.

Cách tốt nhất để chỉ định phiên bản JDK là gì?

Đối với Java 8 trở xuống:

Không maven.compiler.source/ maven.compiler.targetthuộc tính hoặc sử dụngmaven-compiler-plugin là tốt hơn. Nó không thay đổi gì trong thực tế vì cuối cùng hai cách dựa trên cùng một thuộc tính và cùng một cơ chế: plugin trình biên dịch lõi maven.

Chà, nếu bạn không cần chỉ định các thuộc tính hoặc hành vi khác so với các phiên bản Java trong plugin trình biên dịch, sử dụng cách này có ý nghĩa hơn vì điều này ngắn gọn hơn:

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

Từ Java 9:

Đối releasesố (điểm thứ ba) là một cách để xem xét mạnh mẽ nếu bạn muốn sử dụng cùng một phiên bản cho sourcetarget.


10

Tôi gặp phải vấn đề tương tự trong dự án java maven java đơn giản

Nhưng tôi thêm chi tiết bên dưới vào tệp 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>

Sau khi nhấp chuột phải vào dự án> maven> cập nhật dự án (kiểm tra cập nhật lực lượng)

Nó giải quyết cho tôi để hiển thị lỗi trên dự án

Hy vọng nó sẽ hữu ích

Tiếng Phạn


Điều này làm việc cho tôi khi tôi đang cố gắng xây dựng ứng dụng SqlServerSample cho Trình điều khiển JDBC của Microsoft cho SQL Server.
skye --- đội trưởng

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> 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.