Làm thế nào để xác định phiên bản JDK?
1) <java.version>
không được tham chiếu trong tài liệu Maven.
Đó là một đặc tính của Spring Boot.
Nó cho phép đặt nguồn và phiên bản java đích với cùng một phiên bản như phiên bản này để chỉ định java 1.8 cho cả hai:
<properties>
<java.version>1.8</java.version>
</properties>
Hãy sử dụng nó nếu bạn sử dụng Spring Boot.
2) Sử dụng maven-compiler-plugin
hoặc maven.compiler.source
/ maven.compiler.target
thuộc tính để chỉ định source
và target
tương đương.
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
và
<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
vì <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.source
và maven.compiler.target
nếu chúng được xác định.
nguồn
Đối -source
số 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 -target
số 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 source
và target
, lưu ý rằng
kể từ 3.8.0
trình biên dịch maven, các giá trị mặc định đã thay đổi từ 1.5
thành1.6
.
3) Trình biên dịch maven-plugin 3.6
và các phiên bản mới hơn cung cấp một cách mới:
<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ể tuyên bố chỉ:
<properties>
<maven.compiler.release>9</maven.compiler.release>
</properties>
Nhưng tại thời điểm này, nó sẽ không hoạt động như maven-compiler-plugin
phiên bản mặc định mà bạn sử dụng không dựa vào phiên bản đủ gần đây.
Đối release
số 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 target
và các bootstrap
tùy chọn JVM.
Lưu ý rằng việc chỉ định bootstrap
là 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ì?
Cách đầu tiên ( <java.version>
) chỉ được phép nếu bạn sử dụng Spring Boot.
Đối với Java 8 trở xuống:
Về hai cách khác: định giá maven.compiler.source
/ maven.compiler.target
thuộc tính hoặc sử dụng maven-compiler-plugin
, bạn có thể sử dụng cách này hoặc cách khác. Nó không thay đổi gì trong thực tế vì cuối cùng hai giải pháp 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 release
số (đ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 nguồn và đích.
Điều gì xảy ra nếu phiên bản khác nhau giữa JDK trong JAVA_HOME và phiên bản nào được chỉ định trong pom.xml?
Nó không phải là một vấn đề nếu JDK tham chiếu bởi JAVA_HOME
tương thích với các phiên bản được quy định trong pom nhưng để đảm bảo một tương thích chéo biên soạn tốt hơn suy nghĩ về việc thêm các bootstrap
tùy chọn JVM với giá trị là đường dẫn của rt.jar
các target
phiên bản.
Một điều quan trọng cần xem xét là source
và target
phiên bản trong cấu hình Maven không nên vượt trội so với phiên bản JDK được tham chiếu bởi JAVA_HOME
.
Một phiên bản cũ hơn của JDK không thể biên dịch với phiên bản mới hơn vì nó không biết thông số kỹ thuật của nó.
Để có được thông tin về nguồn, nhắm mục tiêu và phát hành các phiên bản được hỗ trợ theo JDK đã sử dụng, vui lòng tham khảo phần biên dịch java: nguồn, đích và phát hành phiên bản được hỗ trợ .
Làm thế nào xử lý trường hợp JDK được tham chiếu bởi JAVA_HOME không tương thích với mục tiêu java và / hoặc phiên bản nguồn được chỉ định trong pom?
Ví dụ: nếu bạn JAVA_HOME
đề cập đến JDK 1.7 và bạn chỉ định JDK 1.8 làm nguồn và đích trong cấu hình trình biên dịch của pom.xml của bạn, thì đó sẽ là một vấn đề vì như đã giải thích, JDK 1.7 không biết cách biên dịch với .
Từ quan điểm của nó, nó là một phiên bản JDK không xác định kể từ khi nó được phát hành sau nó.
Trong trường hợp này, bạn nên cấu hình plugin trình biên dịch Maven để chỉ định JDK theo cách này:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<compilerVersion>1.8</compilerVersion>
<fork>true</fork>
<executable>D:\jdk1.8\bin\javac</executable>
</configuration>
</plugin>
Bạn có thể có nhiều chi tiết hơn trong các ví dụ với plugin trình biên dịch maven .
Nó không được hỏi nhưng trường hợp có thể phức tạp hơn là khi bạn chỉ định nguồn nhưng không nhắm mục tiêu. Nó có thể sử dụng một phiên bản khác trong mục tiêu theo phiên bản nguồn. Các quy tắc rất cụ thể: bạn có thể đọc về chúng trong phần Tùy chọn biên dịch chéo .
Tại sao plugin trình biên dịch được theo dõi trong đầu ra khi thực hiện package
mục tiêu Maven ngay cả khi bạn không chỉ định nó trong pom.xml?
Để biên dịch mã của bạn và nói chung để thực hiện tất cả các nhiệm vụ cần thiết cho mục tiêu maven, Maven cần các công cụ. Vì vậy, nó sử dụng plugin Maven lõi (bạn nhận ra một lõi Maven plugin bằng của nó groupId
: org.apache.maven.plugins
) để thực hiện các nhiệm vụ yêu cầu: trình biên dịch plugin cho các lớp học biên dịch, kiểm tra plugin cho thực hiện các bài kiểm tra, và như vậy cho ... Vì vậy, ngay cả khi bạn không khai báo các plugin này, chúng bị ràng buộc với việc thực hiện vòng đời Maven.
Tại thư mục gốc của dự án Maven của bạn, bạn có thể chạy lệnh: mvn help:effective-pom
để sử dụng hiệu quả pom cuối cùng. Bạn có thể thấy trong số các thông tin khác, các plugin được đính kèm bởi Maven (được chỉ định hoặc không có trong pom.xml của bạn), với phiên bản được sử dụng, cấu hình của chúng và các mục tiêu được thực hiện cho từng giai đoạn của vòng đời.
Trong đầu ra của mvn help:effective-pom
lệnh, bạn có thể thấy phần khai báo của các plugin lõi này trong <build><plugins>
phần tử, ví dụ:
...
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>2.5</version>
<executions>
<execution>
<id>default-clean</id>
<phase>clean</phase>
<goals>
<goal>clean</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.6</version>
<executions>
<execution>
<id>default-testResources</id>
<phase>process-test-resources</phase>
<goals>
<goal>testResources</goal>
</goals>
</execution>
<execution>
<id>default-resources</id>
<phase>process-resources</phase>
<goals>
<goal>resources</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<executions>
<execution>
<id>default-compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>default-testCompile</id>
<phase>test-compile</phase>
<goals>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
...
Bạn có thể có thêm thông tin về nó trong phần giới thiệu về vòng đời Maven trong tài liệu Maven .
Tuy nhiên, bạn có thể khai báo các plugin này khi bạn muốn định cấu hình chúng với các giá trị khác làm giá trị mặc định (ví dụ: bạn đã làm điều đó khi bạn khai báo plugin trình biên dịch maven trong pom.xml để điều chỉnh phiên bản JDK để sử dụng) hoặc khi bạn muốn thêm một số thực thi plugin không được sử dụng theo mặc định trong vòng đời Maven.
<maven.compiler.x>
từ bây giờ sẽ dính vào thuộc tính.