как проверить версию файла jar?



в настоящее время я работаю над польским приложением J2ME, просто улучшая его. Я нахожу трудности, чтобы получить точную версию файла jar.
Есть ли способ найти версию файла jar для импорта, выполненного в классе? Я имею в виду, если у вас есть что-то, импортируйте x.y.z; можем ли мы знать версию пакета jar x.y?

1259   10  

10 ответов:

распакуйте файл JAR и найдите файл манифеста (META-INF\MANIFEST.MF). Файл манифеста JAR-файла может содержать номер версии (но не всегда указывается версия).

вам нужно распаковать его и проверить его , например,

unzip -p file.jar | head

или более конкретно:

unzip -p file.jar META-INF/MANIFEST.MF

просто чтобы расширить ответы выше, внутри мета-INF / манифеста.MF файл в банке, вы, вероятно, увидите строку:Manifest-Version: 1.0 ← Это не номер версии jar!

вы должны искать Implementation-Version который, если присутствует, является строкой свободного текста настолько полностью зависит от автора JAR, что вы найдете там. Смотрите также Oracle docs и версия пакета specificaion

просто для завершения ответа выше.

файл манифеста находится внутри jar по адресу META-INF\MANIFEST.MF путь.

вы можете изучить содержимое jar в любом архиваторе, который поддерживает zip.

каждая версия jar имеет уникальную контрольную сумму. Вы можете рассчитать контрольную сумму для вас jar (которая не имела информации о версии) и сравнить ее с различными версиями jar. Мы также можем искать банку с помощью контрольной суммы.

обратитесь к этому вопросу для вычисления контрольной суммы: каков наилучший способ вычисления контрольной суммы для файла, который находится на моей машине?

эта простая программа перечислит все случаи для версии jar именно

  • в файле манифеста
  • версия не найдена в манифесте и даже из имени jar
  • файл манифеста не найден

    Map<String, String> jarsWithVersionFound   = new LinkedHashMap<String, String>();
    List<String> jarsWithNoManifest     = new LinkedList<String>();
    List<String> jarsWithNoVersionFound = new LinkedList<String>();
    
    //loop through the files in lib folder
    //pick a jar one by one and getVersion()
    //print in console..save to file(?)..maybe later
    
    File[] files = new File("path_to_jar_folder").listFiles();
    
    for(File file : files)
    {
        String fileName = file.getName();
    
    
        try
        {
            String jarVersion = new Jar(file).getVersion();
    
            if(jarVersion == null)
                jarsWithNoVersionFound.add(fileName);
            else
                jarsWithVersionFound.put(fileName, jarVersion);
    
        }
        catch(Exception ex)
        {
            jarsWithNoManifest.add(fileName);
        }
    }
    
    System.out.println("******* JARs with versions found *******");
    for(Entry<String, String> jarName : jarsWithVersionFound.entrySet())
        System.out.println(jarName.getKey() + " : " + jarName.getValue());
    
    System.out.println("\n \n ******* JARs with no versions found *******");
    for(String jarName : jarsWithNoVersionFound)
        System.out.println(jarName);
    
    System.out.println("\n \n ******* JARs with no manifest found *******");
    for(String jarName : jarsWithNoManifest)
        System.out.println(jarName);
    

Он использует javaxt-core jar, который можно загрузить с http://www.javaxt.com/downloads/

в основном вы должны использовать java.lang.Package класс, который использует загрузчик классов, чтобы дать вам информацию о ваших классах.

пример:

String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("java.lang.String").getImplementationVersion();

Я думаю, что logback, как известно, использует эту функцию для отслеживания имени/версии JAR каждого класса в его созданных stacktraces.

Смотрите также http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779

Я опаздываю, но вы можете попробовать следующие два метода

используя эти классы нужны

import java.util.jar.Attributes;
import java.util.jar.Manifest;

эти методы позволяют мне получить доступ к атрибутам jar. Мне нравится быть обратно совместимым и использовать последние. Поэтому я использовал это

public Attributes detectClassBuildInfoAttributes(Class sourceClass) throws MalformedURLException, IOException {
    String className = sourceClass.getSimpleName() + ".class";
    String classPath = sourceClass.getResource(className).toString();
    if (!classPath.startsWith("jar")) {
      // Class not from JAR
      return null;
    }
    String manifestPath = classPath.substring(0, classPath.lastIndexOf("!") + 1) + 
        "/META-INF/MANIFEST.MF";
    Manifest manifest = new Manifest(new URL(manifestPath).openStream());
    return manifest.getEntries().get("Build-Info");
}

public String retrieveClassInfoAttribute(Class sourceClass, String attributeName) throws MalformedURLException, IOException {
    Attributes version_attr = detectClassBuildInfoAttributes(sourceClass);

    String attribute = version_attr.getValue(attributeName);

    return attribute;
}

это хорошо работает, когда вы используете maven и нужны детали pom для классов know. Надеюсь, это поможет.

вы можете отфильтровать версию из файла манифеста с помощью

unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'

Это можно проверить с помощью команды java -jar jarname

Comments

    Ничего не найдено.