2014-01-08 63 views
12

我想向我創建的庫添加版本信息(可能還有其他關於jar的其他元數據)。但是,我不確定要使用什麼屬性。我發現specification以及documentation解釋可以有一個Specification-Version和一個Implementation-Version(以及兩者的標題和供應商)。但是沒有正確解釋規範和實現之間的區別。JAR清單文件 - 規範與實現之間的區別

我也看了不同的例子。

  • documentation中的一個使用了可讀的名稱作爲Specification-Title和Implementation-Title的包​​名稱。規格版本使用點分離的版本號,而實現版本使用簡單的版本號。
  • Gradle教程似乎只是使用Implementation-Version和人類可讀的字符串實現標題
  • another question我發現了一個示例,其中包含幾個Implementation-Versions。

這裏的規範和實現元數據究竟有什麼區別?應該如何使用這些不同的屬性(特別是版本號)?規範和實施的供應商有何不同?

它甚至發揮我放在那裏的作用嗎?

回答

10

每個的含義在documentation of java.lang.Package說明之一。

Specification-Version必須由用ASCII句點分隔的ASCII數字序列組成。沒有其他字符是允許的,週期不能在值的開始或結束處,並且連續的週期是不允許的。

Implementation-Version是一個自由形式的字符串。它可以有任何格式。

規範 - 版本始終與包關聯。如果您爲整個清單而不是特定包指定它,它將應用於.jar文件中的所有包。

Specification-Version被許多Java技術用作解決依賴性的手段。如果有些程序需要說明它需要版本2.1或更高版本的JMF庫,則某些Java環境將分析每個清單的Specification-Version中與匹配的Specification-Title相對應的數字,並確保正確的版本(和沒有其他版本)在運行時在類路徑中可用。

事實上,Package.isCompatibleWith方法做了這個檢查。你甚至可以用它來檢查最低的Java版本:

if (System.class.getPackage().isCompatibleWith("1.6")) { 
    System.out.println("Running in Java 1.6 or later."); 
} 
+0

另請參閱https://docs.oracle.com/javase/8/docs/technotes/guides/extensions/versioning.html – SWdV

6

好,規格是你的合同,如:

  • 標準,例如JAXB,JDBC或各的Java EE標準之一(例如EJB 2.x中,EJB 3.0,EJB 3.1)
  • 將API應用於您的庫,框架或服務

該實現就是該規範的實現。

雖然規範的API(因而規範版本)可能不會改變,實現版本還不如你修復bug等改變

+1

啊,我明白了,所以當我改變我的庫的API我應該改變的規範版本,但是當我剛剛修復的bug(即作出這樣的API應該做的一切)我只更改實現版本? –

+1

是的。但請注意,這些通常主要用於文檔目的,因爲沒有許多工具和庫與這些Manifest條目AFAIK一起工作。如果您需要工具/框架支持,我建議:編譯時間:使用Maven版本控制的Maven倉庫中的jar。運行時間:考慮OSGi – Puce

3

考慮的servlet-api.jar文件從Apache Tomcat上清單:

Manifest-Version: 1.0 
Ant-Version: Apache Ant 1.8.4 
Created-By: 1.7.0_40-b43 (Oracle Corporation) 
X-Compile-Source-JDK: 1.7 
X-Compile-Target-JDK: 1.7 

Name: javax/servlet/ 
Specification-Title: Java API for Servlets 
Specification-Version: 3.1 
Specification-Vendor: Sun Microsystems, Inc. 
Implementation-Title: javax.servlet 
Implementation-Version: 3.1.FR 
Implementation-Vendor: Apache Software Foundation 

阿帕奇是在Servlet 3.1規範的幾個implementators通過the JCP(由Sun成立)中所定義