Ответ 1
Декомпрессируйте файл JAR и найдите файл манифеста (META-INF\MANIFEST.MF
). Файл манифеста JAR файла может содержать номер версии (но не всегда указан вариант).
В настоящее время я работаю над польским приложением J2ME, просто улучшая его. Мне трудно найти точную версию файла jar. Есть ли способ найти версию файла jar для импорта, сделанного в классе? Я имею в виду, если у вас есть что-то, импортируйте x.y.z; мы можем знать, что версия пакета jar x.y принадлежит?
Декомпрессируйте файл JAR и найдите файл манифеста (META-INF\MANIFEST.MF
). Файл манифеста JAR файла может содержать номер версии (но не всегда указан вариант).
Вам нужно разархивировать его и проверить его файл META-INF/MANIFEST.MF
, например
unzip -p file.jar | head
или более конкретно:
unzip -p file.jar META-INF/MANIFEST.MF
Чтобы развернуть ответы выше, внутри файла META-INF/MANIFEST.MF в JAR, вы, скорее всего, увидите строку: Manifest-Version: 1.0
← Это НЕ номер версии баннеров
Вам нужно искать Implementation-Version
, который, если присутствует, представляет собой строку со свободным текстом, полностью связанную с автором JAR, в зависимости от того, что вы найдете там.
См. Также Документы Oracle и Спецификация версии пакета
Просто для завершения вышеуказанного ответа.
Файл манифеста находится внутри jar на пути META-INF\MANIFEST.MF
.
Вы можете просмотреть содержимое jar в любом архиваторе, поддерживающем zip.
Каждая версия jar имеет уникальную контрольную сумму. Вы можете рассчитать контрольную сумму для вас jar (которая не имела информации о версии) и сравнить ее с различными версиями банки. Мы также можем искать банку с помощью контрольной суммы.
Отправьте этот вопрос для расчета контрольной суммы: Каков наилучший способ вычисления контрольной суммы для файла, который находится на моей машине?
По сути, вы должны использовать класс java.lang.Package
, который использует загрузчик классов для предоставления вам информации о ваших классах.
Пример:
String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("java.lang.String").getImplementationVersion();
Я думаю, что logback, как известно, использует эту функцию для отслеживания имени/версии JAR каждого класса в его произведенных трассировках стека.
смотрите также http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779
В этой простой программе перечислены все случаи для версии 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/
Я опоздал, но вы можете попробовать следующие два метода
используя эти необходимые классы
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 для известных классов. Надеюсь это поможет.
Вы можете отфильтровать версию из файла MANIFEST, используя
unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'
Для Linux попробуйте следующее:
находить. -name "YOUR_JAR_FILE.jar" -exec zipgrep "Версия-реализация:" '{}' \; | awk -F ':' '{print $ 2}'
Если у вас есть WinRar, откройте банку с WinRAR, дважды щелкните, чтобы открыть папку META-INF. Извлеките файл MANIFEST.MF в любое место (скажем, на рабочем столе). Откройте извлеченный файл в текстовом редакторе: вы увидите вариант реализации.
Его можно проверить с помощью команды java -jar jarname