Chỉ định phiên bản java trong maven - sự khác biệt giữa các thuộc tính và plugin trình biên dịch

191
Plebejusz 2016-08-11 09:35.

Tôi không có nhiều kinh nghiệm với maven và trong khi thử nghiệm với dự án đa mô-đun, tôi bắt đầu tự hỏi làm thế nào tôi có thể chỉ định phiên bản java cho tất cả các mô-đun con của tôi trong maven pom mẹ. Cho đến hôm nay tôi chỉ sử dụng:

<properties>
    <java.version>1.8</java.version>
</properties>

nhưng khi nghiên cứu, tôi thấy rằng bạn cũng có thể chỉ định phiên bản java trong plugin trình biên dịch maven, như sau:

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

Và sau đó bọc nó vào thẻ quản lý plugin để cho phép các poms con sử dụng nó. Vì vậy, câu hỏi đầu tiên là sự khác biệt giữa việc thiết lập phiên bản java của Beetwen trong thuộc tính và trong plugin trình biên dịch maven là gì?

Tôi không thể tìm thấy câu trả lời rõ ràng nhưng trong quá trình nghiên cứu, tôi thấy rằng bạn cũng có thể chỉ định phiên bản java theo cách này:

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

gợi ý rằng plugin trình biên dịch ở đó ngay cả khi tôi không tuyên bố rõ ràng về nó. Chạy gói mvn đầu ra với

maven-compiler-plugin:3.1:compile (default-compile) @ testproj ---

và một số plugin khác mà tôi không khai báo. Vậy những plugin đó có phải là phần mặc định, phần ẩn của maven pom không? Có bất kỳ sự khác biệt nào trong việc thiết lập nguồn / đích của Beetwen trong thuộc tính và trong phần tử cấu hình plugin maven không?

Một số câu hỏi khác là - nên sử dụng cách nào (và khi nào nếu chúng không bằng nhau)? Cái nào tốt nhất cho dự án nhiều mô-đun và điều gì sẽ xảy ra nếu phiên bản java được chỉ định trong pom khác với phiên bản được trỏ trong JAVA_HOME?

3 answers

319
davidxxx 2016-08-11 10:35.

Làm thế nào để chỉ định phiên bản JDK?

Sử dụng bất kỳ cách nào trong ba cách: (1) Tính năng Spring Boot hoặc sử dụng plugin trình biên dịch Maven với (2) source& targethoặc (3) với release.

Khởi động mùa xuân

  1. <java.version>không được tham chiếu trong tài liệu Maven.
    Đó là một đặc điểm riêng của Spring Boot.
    Nó cho phép đặt nguồn và phiên bản java đích có cùng phiên bản, chẳng hạn như phiên bản này để chỉ định java 1.8 cho cả hai:

    1,8

Hãy thoải mái sử dụng nó nếu bạn sử dụng Spring Boot.

maven-compiler-pluginvới source&target

  1. Sử dụng thuộc tính maven-compiler-pluginhoặc maven.compiler.source/ maven.compiler.targetđể chỉ định sourcevà các thuộc targettính tương đương.

    maven-compiler-plugin 1.8 1.8

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

là tương đương theo tài liệu Maven của plugin trình biên dịch<source>và các <target>phần tử 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.
Sở hữu tài khoản 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.
Sở hữu tài khoản là: maven.compiler.target.

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

maven-compiler-pluginvới releasethay vì source&target

  1. Maven-compiler-plugin 3.6và các phiên bản mới hơn cung cấp một cách mới:

    org.apache.maven.plugins maven-compiler-plugin 3.8.0 9

Bạn cũng có thể chỉ cần khai báo:

<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 vì maven-compiler-pluginphiên bản mặc định bạn sử dụng không dựa trên phiên bản đủ gần đây.

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

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

Cách này cung cấp một cách tiêu chuẩn để chỉ định cùng một phiên bản cho các tùy chọn source, targetbootstrapJVM.
Lưu ý rằng việc chỉ định bootstraplà một phương pháp hay cho việc biên dịch chéo và nó sẽ không ảnh hưởng gì nếu bạn không thực hiệ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.targetthuộ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 có gì thay đổi trong thực tế vì cuối cùng hai giải pháp dựa trên các thuộc tính giống nhau 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 với các phiên bản Java trong plugin trình biên dịch, thì việc sử dụng cách này sẽ hợp lý hơn vì nó 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 cần xem xét kỹ lưỡng 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 đượ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_HOMEtươ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 bootstraptùy chọn JVM với giá trị là đường dẫn của rt.jarcác targetphiên bản.

Một điều quan trọng cần xem xét là phiên bản sourcetargetphiên bản trong cấu hình Maven không được cao hơn phiên bản JDK được tham chiếu bởi JAVA_HOME.
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 đặc điểm kỹ thuật của nó.

Để có thông tin về nguồn, đích 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 biên dịch java: mã nguồn, đích và phát hành các 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 các phiên bản đích và / hoặc nguồn java đượ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, 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 .
Theo 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 đó.
Trong trường hợp này, bạn nên định 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ó thêm chi tiết trong các ví dụ với plugin trình biên dịch maven .


Nó không được hỏi nhưng các trường hợp có thể phức tạp hơn là khi bạn chỉ định nguồn nhưng không phải đích. 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 đặc biệt: 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 packagemụ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 là để thực hiện tất cả các tác vụ cần thiết cho một 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 được ràng buộc với việc thực thi vòng đời của Maven.
Tại thư mục gốc của dự án Maven, 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 đính kèm của Maven (được chỉ định hoặc không có trong pom.xml của bạn), với phiên bản đã sử dụng, cấu hình của chúng và các mục tiêu đã thực thi cho từng giai đoạn của vòng đời.

Trong đầu ra của mvn help:effective-pomlệnh, bạn có thể thấy phần khai báo của các plugin cốt 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 của 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 khai báo plugin maven-compiler trong pom.xml của mình để đ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 của Maven.

3
Sen 2018-11-21 04:01.

Không có giải pháp nào ở trên phù hợp với tôi ngay lập tức. Vì vậy, tôi đã làm như sau: -

  1. Thêm

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

    trong pom.xml

  2. Đã đi đến Project Properties > Java Build Path, sau đó xóa Thư viện Hệ thống JRE được trỏ tới JRE1.5.

  3. Lực lượng cập nhật dự án.

0
Stefano 2018-06-13 23:51.

Cân nhắc lựa chọn thay thế:

<properties>
    <javac.src.version>1.8</javac.src.version>
    <javac.target.version>1.8</javac.target.version>
</properties>

Nó phải giống như vậy maven.compiler.source/maven.compiler.targetnhưng giải pháp ở trên phù hợp với tôi, nếu không giải pháp thứ hai nhận được đặc điểm kỹ thuật gốc (tôi có một matrioska của .pom)

Related questions

MORE COOL STUFF

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett chia tay chồng sau 3 ngày bên nhau và vẫn kết hôn với anh ấy 25 năm sau

Cate Blanchett đã bất chấp những lời khuyên hẹn hò điển hình khi cô gặp chồng mình.

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Tại sao Michael Sheen là một diễn viên phi lợi nhuận

Michael Sheen là một diễn viên phi lợi nhuận nhưng chính xác thì điều đó có nghĩa là gì?

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Hallmark Star Colin Egglesfield Các món ăn gây xúc động mạnh đối với người hâm mộ tại RomaDrama Live! [Loại trừ]

Ngôi sao của Hallmark Colin Egglesfield chia sẻ về những cuộc gặp gỡ với người hâm mộ ly kỳ tại RomaDrama Live! cộng với chương trình INSPIRE của anh ấy tại đại hội.

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Tại sao bạn không thể phát trực tuyến 'chương trình truyền hình phía Bắc'

Bạn sẽ phải phủi sạch đầu đĩa Blu-ray hoặc DVD để xem tại sao Northern Exposure trở thành một trong những chương trình nổi tiếng nhất của thập niên 90.

Where in the World Are You? Take our GeoGuesser Quiz

Where in the World Are You? Take our GeoGuesser Quiz

The world is a huge place, yet some GeoGuessr players know locations in mere seconds. Are you one of GeoGuessr's gifted elite? Take our quiz to find out!

8 công dụng tuyệt vời của Baking Soda và Giấm

8 công dụng tuyệt vời của Baking Soda và Giấm

Bạn biết đấy, hai sản phẩm này là nguồn điện để làm sạch, riêng chúng. Nhưng cùng với nhau, chúng có một loạt công dụng hoàn toàn khác.

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Hạn hán, biến đổi khí hậu đe dọa tương lai của thủy điện Hoa Kỳ

Thủy điện rất cần thiết cho lưới điện của Hoa Kỳ, nhưng nó chỉ tạo ra năng lượng khi có nước di chuyển. Bao nhiêu nhà máy thủy điện có thể gặp nguy hiểm khi các hồ và sông cạn kiệt?

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Quyên góp tóc của bạn để giúp giữ nước sạch của chúng tôi

Tóc tỉa từ các tiệm và các khoản quyên góp cá nhân có thể được tái sử dụng như những tấm thảm thấm dầu và giúp bảo vệ môi trường.

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Đây là Tổng thống Trump đe dọa 'trợ cấp' xe điện của GM vì đóng cửa nhà máy

Trump và Giám đốc điều hành GM Mary Barra vào năm 2017. Kể từ khi tin tức nổ ra ngày hôm qua rằng General Motors đang cắt giảm việc làm ở Bắc Mỹ để chuẩn bị cho tương lai điện / xe tự hành / khủng khiếp có thể xảy ra của chúng tôi, gần như tất cả mọi người đã tự hỏi: Tổng thống Trump, người đã vận động tranh cử trên một nền tảng sẽ như thế nào của việc mang lại và duy trì việc làm ô tô của Mỹ, phải nói gì về điều này? Bây giờ chúng ta biết.

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bản vá lỗi tiếp theo của Fallout 76 sẽ mang lại một số bản sửa lỗi cần thiết

Bethesda cho biết ngày hôm nay trên Reddit, Fallout 76 sẽ có một bản vá lớn khác vào ngày 4 tháng 12, sẽ bắt đầu cố gắng khắc phục một số vấn đề lớn hơn của trò chơi. Ngoài ra, công ty cho biết họ có kế hoạch giao tiếp nhiều hơn trong tương lai về những gì nhóm Fallout 76 đang làm việc và khi nào các bản cập nhật mới cho trò chơi sẽ ra mắt.

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Mạng lưới bệnh viện Công giáo sẽ không cho phép nhân viên phá thai tại phòng khám ngoài giờ làm việc

Bạn có biết rằng một trong sáu bệnh nhân ở bệnh viện ở Hoa Kỳ được điều trị tại một cơ sở Công giáo? Và bạn có biết rằng quyền sở hữu của Công giáo hạn chế sâu sắc việc thiết lập các thủ tục y tế có thể được thực hiện trong các bệnh viện này, rõ ràng nhất là khi nói đến chăm sóc sức khỏe sinh sản? Bây giờ NPR báo cáo rằng sự gia tăng của các bệnh viện thuộc Công giáo đang gây khó khăn hơn cho các bác sĩ — những người bị cấm bởi các quy định do Hoa Kỳ viết.

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Khói từ đám cháy rừng ở California đã đến tận thành phố New York

Đường chân trời San Francisco bị che khuất bởi khói và khói mù do cháy rừng phía sau Đảo Alcatraz, Thứ Tư, ngày 14 tháng 11 năm 2018, ở San Francisco.

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Forced to Borrow Paris' 'I Love Paris' Sweatshirt After 'Airline Loses All [My] Luggage'

Nicky Hilton Rothschild's luggage got lost, but luckily she has an incredible closet to shop: Sister Paris Hilton's!

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa

Kate Middleton dành một ngày bên bờ nước ở London, cùng với Jennifer Lopez, Julianne Hough và hơn thế nữa. Từ Hollywood đến New York và mọi nơi ở giữa, hãy xem các ngôi sao yêu thích của bạn đang làm gì!

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

17 tuổi bị đâm chết trong khi 4 người khác bị thương trong một cuộc tấn công bằng dao trên sông Wisconsin

Các nhà điều tra đang xem xét liệu nhóm và nghi phạm có biết nhau trước vụ tấn công hay không

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Thanh thiếu niên, Gia đình Florida Hội đồng quản trị trường học về Luật 'Không nói đồng tính': 'Buộc chúng tôi tự kiểm duyệt'

Vụ kiện, nêu tên một số học khu, lập luận rằng dự luật "Không nói đồng tính" được ban hành gần đây của Florida "có hiệu quả im lặng và xóa bỏ học sinh và gia đình LGBTQ +"

Đường băng hạ cánh

Đường băng hạ cánh

Cuối hè đầu thu là mùa hoài niệm. Những chiếc đèn đường chiếu ánh sáng của chúng qua những con đường đẫm mưa, và những chiếc lá dưới chân - màu đỏ cam tắt trong bóng chạng vạng - là lời nhắc nhở về những ngày đã qua.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Hãy tưởng tượng tạo ra một chiến lược nội dung thực sự CHUYỂN ĐỔI. Nó có thể.

Vào năm 2021, tôi khuyến khích bạn suy nghĩ lại mọi thứ bạn biết về khách hàng mà bạn phục vụ và những câu chuyện bạn kể cho họ. Lùi lại.

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Sự mất mát của voi ma mút đã mở ra trái tim tôi để yêu

Vào ngày sinh nhật thứ 9 của Felix The Cat, tôi nhớ về một trong những mất mát lớn nhất trong cuộc đời trưởng thành của tôi - Sophie của tôi vào năm 2013. Tôi đã viết bài luận này và chia sẻ nó trên nền tảng này một thời gian ngắn vào năm 2013.

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Khi bạn không thể trở thành người mà Internet muốn bạn trở thành

Tôi ghét từ "tàu đắm". Mọi người cảm thấy thoải mái trong la bàn đạo đức của riêng mình, và khi làm như vậy, họ thấy mình vượt qua sự phán xét.

Language