2014-01-08 52 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成立)中所定义