[英]How to tell the range of java versions a jar is compiled for
如何查看已編譯的jar文件將使用哪些Java版本?
謝謝
通常MANIFEST.MF
文件將此信息作為屬性,如果找不到,請解壓縮jar並選擇一個類並執行
$javap -verbose SomeClass.class | grep 'major'
major version: 50
這是通過此鏈接說明的已編譯Java類文件的結構:
http://en.wikipedia.org/wiki/Java_class_file
章節[編輯] Java類文件結構有10個基本部分:
- 幻數:0xCAFEBABE
- 類文件格式的版本:類文件的次要和主要版本
- 常量池:類的常量池
- 訪問標志:例如,類是抽象的,靜態的等等。
- 此類:當前類的名稱
- 超級班級:超級班級的名稱
- 接口:類中的任何接口
- 欄位:課程中的所有欄位
- 方法:類中的任何方法
- 屬性:類的任何屬性(例如源文件的名稱等)
如您所見,第二點是版本。 因此,下載一個十六進制編輯器,打開jar中的任何.class
文件,您將能夠讀取該版本。
編輯: Altough我從未驗證過,版本的字節偏移量假設在4到7之間,再次來自同一個鏈接。
編輯2:如果您更喜歡使用命令,請檢查此線程: 如何檢查用於編譯.class文件的jdk版本
Jar文件中沒有這樣的信息,特別是考慮到你的術語“java版本編譯的jar文件將與之一起使用”在很大程度上取決於你如何定義“將工作”。 應用程序可以啟動,運行一秒鍾,然后異常終止。 這是否已經滿足您對“可行”的定義?
正如其他人所說,類文件中有一個版本號。 您可以在此處找到有關如何將版本號映射到Java版本的信息 。
但是,該版本號僅告訴您加載該類文件所需的最低JVM版本。 它不會告訴您它所針對的API。 編譯與Java 1.1 JVM兼容但使用Java 8 API的類文件是完全合法的。
您可以掃描Jar文件中所有類文件的所有類和成員引用,並與官方API版本進行比較,但這只會告訴您哪些是有效使用的,而不是有意使用的。 例如,應用程序仍可能依賴於已修復的某些錯誤或缺少已存在的API中的功能。 例如,應用程序是否依賴於“JRE的AWT可以加載具有正確透明度支持的PNG圖像”的要求,無法通過查看類文件版本號或它引用的API來得出結論。
指定應用程序或庫所需的Java版本超出了簡單Jar文件的范圍,例如,您可以查看OSGi或Java Webstart。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.