Apache Maven JDeps插件3.0.0版本發布
一個全新的maven插件 剛剛發布 ,可利用jdeps實用程序查找JDK內部API的使用情況。當該插件被激活時,在代碼中如果發現任何內部API的調用都會導致maven構建失敗。從Java 9開始,內部API將變為不可訪問,因此這個插件可以幫助開發者讓他們的代碼與下一版本的Java兼容。盡管標注為3.0.0,實際上這是該插件的第一個發布版本。
正如在其 項目主頁 中所描述的,該插件為用戶提供兩個可用的目標:jdkinternals和test-jdkinternals。前一個目標會檢查主代碼中是否包含對內部API的引用,而后一個則對測試代碼做同樣的檢查;jdkinternals默認情況下會與maven的process-classes階段(在編譯后立即執行)相關聯,而test-jdkinternals則會與process-test-classes階段相關聯(在測試代碼編譯后立即執行)。默認的配置可以引用該插件并以如下方式同時激活兩個目標:
<build> <plugins> <plugin> <groupid>org.apache.maven.plugins</groupid> <artifactid>maven-jdeps-plugin</artifactid> <version>3.0.0</version> <executions> <execution> <goals> <goal>jdkinternals</goal> <goal>test-jdkinternals</goal> </goals> </execution> </executions> </plugin> <!— Other plugins —> </plugins> </build>
舉例來說,假設一個項目使用了內部類 sun.misc.BASE64Decoder 。當該項目配置使用了JDeps插件,maven會構建失敗并提示如下原因:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-jdeps-plugin:3.0.0:jdkinternals (default) on project: Found offending packages: [ERROR] sun.misc -> JDK internal API (rt.jar) [ERROR] -> [Help 1]
作為其中一部分輸出,對于項目中的每個包,maven還會列示出所有引用了該段代碼的包,以及該包的源碼。作為上個示例輸出的一部分,我們會發現如下包中使用了BASE64Decoder:
package.name (classes) [... other packages ...] -> sun.misc JDK internal API (rt.jar)
這能夠幫助開發人員定位出現問題的地方。不過有另外一種方法能夠獲取到更多細節。 如之前所述,這個插件基于由Oracle提供的,作為JDK 8一部分的 jdeps 工具包。如果插件由于查找到對內部API的引用,強制構建失敗,用戶就可以使用jdeps嘗試找出與導致問題的API相關的更多信息;有時,如果有非內部API可替換,jdeps甚至可以為用戶指出該非內部API。繼續上面提到的BASE64Decoder的例子,運行帶有合適選項的jdeps將會得出如下結果:
jdeps -jdkinternals target/classes/* [...] JDK Internal API Suggested Replacement ---------------- --------------------- sun.misc.BASE64Decoder Use java.util.Base64 @since 1.8
不過,如果某個內部API還不存在可替代品,就像sun.misc.Unsafe,這個插件有可能會阻斷開發。由于這個緣故,該插件對于那些目前尚未使用任何內部API并且希望確保將來也不會使用它們的用戶來說最為實用。Martijn Verburg,jClarity的聯合創始人,自2012年以來的Java冠軍程序員,在 最近的一次交流 當中,鼓勵所有的開發者使用Apache Maven JDeps插件,以減少將來向Java 9遷移所需投入的精力。