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