我在ARM架構上構建了一個.jardocker,在AMD64上構建了一個。
這兩個.jar檔案的大小相同,但vbindiff表示它們的內容完全不同。
我在我的 AMD64 計算機上測驗了這兩個.jar檔案,并且相反的口號“隨處構建,運行一次”成立。
我的假設是這與Java Native Interface (JNI)有關。這.jar是一個 Spring Boot Webflux 后端。不幸的是,我不知道它或任何其他依賴項是否使用 JNI。
我注意到 ARM 映像安裝了JDK 17.0.3,而 AMD64 映像安裝了JDK 17.0.2。但這應該不是問題,因為我使用Gradle wrapper.jar構建了兩個s ,它指定了要下載并用于構建專案的確切工具鏈:
kotlin("jvm") version "1.6.10"
造成這種差異的原因可能是什么?我可以假設兩者.jar都可以在具有兼容 JVM 的任何平臺上使用嗎?
編輯:我聽從了 Thomas 的建議并用來diff -r比較.jar檔案的提取內容。它們是相同的。
但是,diff確認.jar檔案本身是不同的。
我剛剛了解到該.jar格式基于.zip,它可以使用各種壓縮方法,以及在檔案頭中包含額外資訊,例如“最后修改”或可選的作業系統特定屬性。謎團已揭開。
uj5u.com熱心網友回復:
您可以列出.jarusing中的檔案jar tf myfile.jar。如果唯一的內容是.class檔案和清單資料META-INF/,那么它很有可能是 100% 可移植的。如果您看到其他檔案,如.so,.dll或.dylib,則其中有本機代碼可能會帶來麻煩。
以下是列出所有可能需要仔細查看的檔案的方法:
jar tf myfile.jar | grep -Pv '^META-INF/|(\.class|/)$'
由于您已經.jar在兩個不同的平臺上構建了 s,您還可以使用提取它們的內容jar xf myfile.jar并使用diff -r遞回比較它們。這是一種比直接比較檔案更強大的檢測差異的方法,盡管我認為.class檔案可能在位元組方面也不相同,即使它們在語意上是相同的。
uj5u.com熱心網友回復:
我真的不知道為什么會有區別,但我幾乎可以肯定,只要你的 java 代碼中沒有任何特定于平臺的東西,.jar 檔案就可以在任何地方運行。您的代碼是為 JVM 而不是為 CPU 的體系結構編譯的。JVM 負責將您的 java 二進制檔案“翻譯”為機器代碼,因此它可以在任何地方運行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/483649.html
