簡體   English   中英

如何判斷編譯jar的java版本范圍

[英]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

並映射該主要版本的javac版本

這是通過此鏈接說明的已編譯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.

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