Как установить версию пакета

Это /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

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.

Вам может потребоваться установить дополнения ClassLoader следующим образом

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, даже если он вызывается из системного класса. При вызове из загруженного класса загрузчика классов он возвращает эквивалент 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 cfm MyJar.jar Manifest.txt MyPackage/*.class

API для доступа к нему объясняется как https://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html

Другие вопросы по тегам