这是/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
答案 0 :(得分:3)
您可能需要按如下方式设置ClassLoader Additions
1.5.7 java.lang.ClassLoader Additions
为了支持Packages,类扩展器被扩展为跟踪从类到包的映射,并允许类加载器为它们加载的类定义Package实例。定义了其他方法,以允许子类在此类加载器中定义包,以允许Package实现获取有关此类加载器定义的包的信息。
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。从类加载器加载的类调用时,它将返回this.getClass()。getClassLoader()的等价物。它的行为与当前的SecurityManager.currentClassLoader方法相同,但是是公共的。
子类使用受保护的访问definePackage方法来定义它正在加载的类的包。具有给定名称的包只能定义一次,并且必须在加载该包的第一个类之前定义。如果清单可用,则类加载器应提供清单中的版本控制属性。
您可以使用以下示例进行版本控制
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
答案 1 :(得分:2)
我错过了新行!
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。