如何设置软件包版本



这是/META-INF/MANIFEST.MF:

Manifest-Version: 1.0
Created-By: peter
Name: foo/
Implementation-Version: foo1
Name: bar/
Implementation-Version: bar1

这是类

package foo;
public class FooTest {
}
package bar;
public class BarTest {
}
package test;
public class Test {
    public static void main (String[] args){
        System.out.println(FooTest.class.getPackage().getImplementationVersion());
        System.out.println(BarTest.class.getPackage().getImplementationVersion());
    }
}

但是它打印的是

bar1
bar1

您可能需要像下面这样设置ClassLoader Additions

1.5.7 java.lang.ClassLoader新增功能

为了支持包,类加载器被扩展为跟踪从类到包的映射,并允许类加载器为它们加载的类定义包实例。定义额外的方法是为了允许子类在这个类加载器中定义包,允许包实现获得由这个类加载器定义的包的信息。

java.lang.Package实现需要识别当前的类加载器,以便从系统代码调用它。

package java.lang;
public class ClassLoader {      
        ...     
        // Return the non-null classloader of callers   
        public static ClassLoader currentClassLoader(); 
        // Define a Package     
        protected Package(String pkgname,                                       
                        String spectitle, String specversion,                                   
                        String specvendor,      String impltitle,                                       
                        String implversion, String implvendor); 
} 

currentClassLoader方法用于查找当前ClassLoader,即使是从系统类调用。当从classloader加载的类调用时,它将返回this.getClass(). getclassloader()的等价物。它的行为与当前的SecurityManager相同。currentClassLoader方法,但是是公共的。

受保护的访问defineppackage方法被子类用来定义它正在加载的类的包。具有给定名称的包只能定义一次,并且必须在装入该包的第一个类之前定义。如果清单中的版本控制属性可用,类装入器应该提供这些属性。

您可以使用以下示例对

进行版本控制
Name: java/util/
Specification-Title: Java Utility Classes
Specification-Version: 1.2
Specification-Vendor: Example Tech, Inc.
Implementation-Title: java.util
Implementation-Version: build57
Implementation-Vendor: Example Tech, Inc.

您可以参考https://docs.oracle.com/javase/tutorial/deployment/jar/packageman.html

上的标准文档来了解包的版本。

创建一个jar,然后尝试访问

jar cfm MyJar.jar Manifest.txt MyPackage/*.class

访问它的API解释为https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp89936

已解决

我漏了换行符!

Manifest-Version: 1.0
Created-By: peter
Name: foo/
Implementation-Version: foo1
Name: bar/
Implementation-Version: bar1

是错误的

Manifest-Version: 1.0
Created-By: peter
Name: foo/
Implementation-Version: foo1
Name: bar/
Implementation-Version: bar1

是正确的!

无论如何都要感谢AurA

最新更新