簡體   English   中英

maven在這里使用哪個編譯器版本?

[英]Which compiler version maven is using here?

我正在使用下面的Maven編譯器插件來編譯我的Java代碼:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <inherited>true</inherited>
    <version>2.5.1</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
    </configuration>
</plugin>

我的java_home指向Java 7。

我的第一個問題是,我的類將使用Java 6還是Java 7進行編譯?

如果使用Java 6(由於<source>1.6</source> ),那么maven如何知道java 1.6作為java home指向1.7的路徑?

如果需要使用Java 1.8編譯源代碼,是否需要將源和目標設置為1.8?

但是,然后,maven如何知道jdk 1.8即將出現?

我需要更改java_home指向Java 8嗎?

簡短的答案:

  1. 由於JAVA_HOME指向Java 1.7,因此將使用Java 1.7中的javac程序(編譯器)。 但是,由於sourcetarget均為1.6 ,因此命令mvn compile將生成可在JRE 1.6上運行的類。 如果您使用javap實用工具看到了與生成的類文件相關聯的主要和次要版本號,這將是顯而易見的。 對於Java 1.8,這些值是52 and 0 ;對於Java 1.7,它們是51 and 0 ;對於Java 1.6,它們是50 and 0 您可能想知道為什么要Java 1.7編譯器生成target = 1.6類。 原因是基於要在其上運行類的運行時(JRE)。 如果您的編譯器和運行時始終在版本上達成共識,則可以不使用這些版本,但是需要在大型團隊中協調這些升級,與此同時,您應始終盡量保持與軟件的最新版本(一個主要版本)保持接近。原因:您想獲取錯誤修復程序)。 要記住的另一件事是source release 1.n requires target release 1.n

  2. 是的,將這些值<source><target>更改為1.8 (也許有一個快捷方式,但我們以后再做吧;)。 確保JAVA_HOME(和PATH)指向JDK 1.8,因為maven-compiler-plugin最終使用來自插件的<configuration> -source-target參數委托給PATH中的javac程序。 查看mvn -X compile的輸出,您將得到類似以下內容的信息:


[DEBUG]   (f) source = 1.8 
[DEBUG]   (f) staleMillis = 0 
[DEBUG]   (f) target = 1.8 
[DEBUG]   (f) useIncrementalCompilation = true 
[DEBUG]   (f) verbose = false 
[DEBUG] -- end configuration -- 
[DEBUG] Using compiler 'javac'.

當心來自Maven docs的以下警告:

僅設置target選項不能保證您的代碼實際在具有指定版本的JRE上運行。 陷阱是僅在更高版本的JRE中存在的API的意外使用,這將使您的代碼在運行時因鏈接錯誤而失敗。 為避免此問題,您可以將編譯器的引導類路徑配置為與目標JRE匹配,或使用Animal Sniffer Maven插件來驗證您的代碼未使用意外的API。

Maven使用在JAVA_HOME中設置的JDK。 您可以在mvn.bat中設置以查找特定的JDK位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM