2017-09-04 95 views
4

我有一個基於Java-9的standalone project與單個類Main.java我正在試驗在Java SE版本上擺動的jdeprscan tool,當我在我的項目上使用版本9運行相同的沒有日誌(假設是預期的行爲)的控制檯:jdeprscan警告與--release 8

➜ standalone git:(master) ✗ jdeprscan --release 9 . 
Directory .: 

意味着存在着一些似乎只是我的代碼沒有使用淘汰的API。

然後我試圖與版本8相同的,雖然我沒有再得到任何Deprecated日誌,但在控制檯中顯示爲項目的某些警告:

➜ standalone git:(master) ✗ jdeprscan --release 8 . 
warning: unknown enum constant javax.jws.WebParam.Mode.IN 
warning: unknown enum constant javax.jws.soap.SOAPBinding.Use.LITERAL 
warning: unknown enum constant javax.annotation.Resource.AuthenticationType.CONTAINER 

問:爲什麼有發佈版本8而不是版本9的警告?要在此處添加詳細信息,例如在JavaSE8 WebParam.Mode.IN中也未標記爲棄用。

問:爲什麼我在首位,甚至讓這些警告,當我的代碼沒有任何與這些枚舉常量的參與?

回答

4

感謝您嘗試使用jdeprscan工具。

這是jdeprscan或底層工具機制中的錯誤。 jdeprscan所做的第一件事是運行JDK中的所有類以查明已棄用的內容。鑑於--release選項,它使用一些內部javac表,其中包含該版本中存在的類庫的表示形式,在本例中爲JDK 8.我還沒有調試過這個功能,但我懷疑JDK中其他位置的某些內容是引用這些特定的枚舉常量,並且jdeprscan正試圖查找它們以查看它們是否被棄用。

但是,這些定義在javax.xml.wsjavax.xml.ws.annotation模塊中,它們不是根模塊默認組的一部分,因此正常查找將找不到它們。這可能是發佈警告的原因。 (請注意,javax.xml.wsjavax.xml.ws.annotation模塊本身過時了,但我不認爲有什麼這個問題。)

我提起JDK-8187155跟蹤此問題。我認爲這不會影響jdeprscan的操作,除了增加噪音。但如果這會導致其他問題,請跟進。

(另請注意,您的代碼使用JDK 9 API List.of這意味着它是一個JDK 9類文件。jdeprscan如果你問它來掃描JDK 9類,但提供--release 8選項也許應該發出警告,它可能也是一個bug,它不會發出這樣的警告。)

+0

(1)感謝Stuart恢復原狀並報告錯誤。 (2)* jdeprscan試圖查找它們以查看它們是否被棄用*但我認爲它們在Java8中也不被棄用,在問題 (3)中已經鏈接*請注意,您的代碼使用了JDK 9 API List.of這意味着它是一個JDK 9類文件* ...我認爲module-info.java是一個更好的證明。 – nullpointer

0

Java 9已經完成了標準庫的重新包裝。這意味着,當您創建一個小應用程序時,依賴庫的數量遠遠小於Java 8中的相應需求。第二個問題的答案是,應用程序的一些傳遞依賴性會在出現警告的那些包中使用註釋。

同樣,對於第一個問題,因爲您沒有明確列出包含這些註釋類的所有jar,所以依賴項掃描程序無法找到定義。警告與棄用無關;它指出jdeprscan無法找到未提供的類中的定義。

+0

該項目的唯一依賴模塊是['java.base'](https://github.com/namannigam/Jigsaw/blob/master/獨立/ SRC /獨立/ module-info.java)。即使我將其刪除,警告仍然存在。 ***依賴庫的數量比Java 8中相應的要求小得多***我沒有用'jdeprscan'得到這個。正如文檔鏈接所說**使用jdeprscan工具作爲靜態分析工具,可以掃描jar文件(或其他類文件聚合)以使用已棄用的API元素。**並且我不確定爲什麼其他警告不是顯示。 – nullpointer