В настоящее время я работаю над J2ME-полиграфическим приложением, просто улучшая его. У меня возникают трудности с получением точной версии jar-файла. Есть ли способ узнать версию jar-файла для импорта, сделанного в классе? Я имею в виду, если у вас есть какая-то вещь, import x.y.z; можем ли мы узнать версию jar пакета x.y?
Просто расширить на ответы выше, внутри мета-инф/манифеста.Файл MF в jar, вы, вероятно, увидите строку: Манифест-версия: 1.0
← это не банку номер версии!
Нужно искать осуществления-версия`, который, если присутствует, представляет собой текстовую строку, поэтому полностью зависит от ОПАРНИКА'ы автор, что вы'll найти там. См. также Оракул документации и пакет устано Версия
Просто чтобы дополнить ответ выше.
Файл манифеста находится внутри jar по пути META-INF\MANIFEST.MF
.
Вы можете просмотреть содержимое jar в любом архиваторе, который поддерживает zip.
Каждая версия jar имеет уникальную контрольную сумму. Вы можете вычислить контрольную сумму для вашего jar (у которого нет информации о версии) и сравнить ее с различными версиями jar. Мы также можем искать jar по контрольной сумме.
Обратитесь к этому вопросу, чтобы вычислить контрольную сумму: https://stackoverflow.com/questions/478722/what-is-the-best-way-to-calculate-a-checksum-for-a-file-that-is-on-my-machine
В общем, вы должны использовать Ява.яз.Пакет
класс, который используют classloader, чтобы дать вам информацию о ваших классах.
пример:
String.class.getPackage().getImplementationVersion();
Package.getPackage(this).getImplementationVersion();
Package.getPackage("java.lang.String").getImplementationVersion();
Я думаю, что Logback так известен, чтобы использовать эту функцию, чтобы отслеживать банке название/версия каждого класса в выпускаемых стеков.
см. также http://docs.oracle.com/javase/8/docs/technotes/guides/versioning/spec/versioning2.html#wp90779
Эта простая программа будет перечислять все аргументы за версию банку, а именно
Карта<строку, строку> jarsWithVersionFound = новый LinkedHashMap<строку, строку и GT;(); Список<строка> jarsWithNoManifest = новый массив LinkedList И Л;строка> В(); Список<строка> jarsWithNoVersionFound = новый массив LinkedList И Л;строка> В();
//перебираем файлы в папку lib //получения в банке по одному и getversion() //выводим в консоль..сохранить в файл(?)..может позже
Файл[] файлов = новый файл (фильм"path_to_jar_folder и").файл-список();
на(файл файл : файлы) { Файл строке filename =.метод getname();
попробовать { Строки jarVersion = новый файл jar(файл).функции getversion();
если(jarVersion == нуль) jarsWithNoVersionFound.добавить(имяфайла); еще jarsWithVersionFound.поставить(именем, jarVersion);
} поймать(исключение бывший) { jarsWithNoManifest.добавить(имяфайла); } }
Системы.из.код println (на" банки с версии нашли и"); для(запись<строку, строку> jarName : jarsWithVersionFound.entrySet()) Системы.из.метод println(jarName.getKey() + " и : " в + jarName.метод getValue());
Системы.из.код println (на"\н \н банки с версии не нашли и"); для(строка jarName : jarsWithNoVersionFound) Системы.из.метод println(jarName);
Системы.из.код println (на"\н \н банки с манифеста не найдено и"); для(строка jarName : jarsWithNoManifest) Системы.из.метод println(jarName);
Он использует javaxt-основной сосуд, который может быть загружен с http://www.javaxt.com/downloads/
Я'м поздно это, но вы можете попробовать один из следующих двух методов
используя эти классы нужны
import java.util.jar.Attributes;
import java.util.jar.Manifest;
Эти методы позволяют мне получить доступ к атрибутам банку. Мне нравится быть совместимы и используют новейшие. Так что я использовал этот
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 и нужна пом детали для известных классов. Надеюсь, что это помогает.
Если у вас есть WinRAR, открыть банку с WinRAR, дважды щелкните, чтобы открыть папку мета-инф`. Экстракт появилось.МФ " и " изменения в файлы в любое место (допустим на рабочем столе).
Откройте распакованные файлы в текстовом редакторе: вы увидите осуществления-версия или версии.
Вы можете отфильтровать версия из файла манифеста, используя
разархивировать -п my.jar мета-инф/манифеста.МФ | грэп 'пачка-версия'
Для Linux, попробуйте следующее:
найти . -именем "YOUR_JAR_FILE.опарник" по-экзек zipgrep "и осуществления-версия: и" '{}' \;|на awk -Е ': ' '{печать $2}'
Это может быть проверено с командой Java -банку jarname