![](/img/trans.png)
[英]Maven Java compiler - compilation error using wrong compliance version
[英]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嗎?
簡短的答案:
由於JAVA_HOME
指向Java 1.7,因此將使用Java 1.7中的javac
程序(編譯器)。 但是,由於source
和target
均為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
是的,將這些值<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.