簡體   English   中英

驗證Jar中的Java類

[英]Validate Java Classes Inside Jar

jars中的Java類文件可以輕松替換和修改。 例如,以下命令可用於替換jar中的已編譯類文件:

jar uf JarFile.jar com\something\Class.class

如果將類文件替換為沒有破壞任何依賴關系的文件,則該代碼仍然可以執行。 不在jar中的類文件也會發生同樣的情況。

有什么方法可以驗證一組類文件(無論是否在jar中),以查看其所有依賴項是否存在並且沒有損壞?

我不想阻止類文件被修改,而是希望能夠驗證更改是否有效(關於依賴項)。 編譯器在編譯時執行此檢查(依賴項檢查),但是一旦編譯了類,如何才能驗證類文件本身?

您可能會想到加蓋簽名 JAR。

更新:

顯然我第一次猜錯了。

如果沒有,您打算怎么辦? 如果他們是第三方,我想說的是除了向錯誤數據庫報告下載錯誤之外,您別無選擇。

如果您的意思是“我想確保他們所有的第三方JAR依賴關系都正確”,那么您遇到的問題要大得多。 我知道的大多數下載內容(例如Spring)都使用Maven使依賴項可用。 那是你所能做的最好的。

如果您是想檢查自己的依賴關系,那我想說測試將揭示您所犯的所有錯誤。

你不能。

至少:不是真的。 問題是Java僅在需要時才在運行時加載類。 因此,最終可以從jar文件中刪除一個類,並且只要沒有執行任何引用該類的代碼,事情運行就非常順利。

考慮以下示例:

class A{ public static void main( String args[] ){ out.println( "hello" ); } }
class B{}

編譯它,將它放在一個罐子里,從中刪除B.class,沒有問題:)

現在您可能會認為可以遍歷每個.class文件,檢查它引用了哪些類,並查看文件是否全部存在。 這不僅痛苦,而且也不完整。 您永遠不會完全捕獲裝載有反射的文件,因為它們的類名可能只是在運行時構造的。

我的建議:不要去那里。 如果有人刪除了一個類文件,那是他們自己的錯。 最好的辦法是(但僅在確實讓您擔心的情況下)嘗試在運行時捕獲ClassNotFoundException (查看thread.setUncaughtExceptionHandler)

只需加載該類即可確保這一點。

暫無
暫無

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

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