提问人:Ritesh Mengji 提问时间:4/30/2011 最后编辑:DamienRitesh Mengji 更新时间:6/21/2023 访问量:273997
如何检查JAR文件的版本?
how to check the version of jar file?
问:
我目前正在开发一个 J2ME 润色应用程序,只是增强它。我发现很难获得 jar 文件的确切版本。 有没有办法找到类中完成的导入的 jar 文件的版本?我的意思是,如果你有一些东西,导入 x.y.z;我们能知道 jar x.y 包所属的版本吗?
答:
解压JAR文件并查找清单文件()。JAR 文件的清单文件可能包含版本号(但并不总是指定版本)。META-INF\MANIFEST.MF
评论
sqljdbc42.jar
只是为了完成上面的答案。
清单文件位于 jar 内的路径。META-INF\MANIFEST.MF
您可以在任何支持 zip 的存档器中检查 jar 的内容。
评论
每个 jar 版本都有一个唯一的校验和。您可以计算 jar(没有版本信息)的校验和,并将其与不同版本的 jar 进行比较。我们还可以使用校验和搜索 jar。
请参阅此问题来计算校验和:计算计算机上文件的校验和的最佳方法是什么?
评论
只是为了扩展上面的答案,在 META-INF/MANIFEST 中。MF 文件,您可能会看到一行: ←这不是 jar 版本号!Manifest-Version: 1.0
您需要查找哪个(如果存在)是自由文本字符串,因此完全取决于 JAR 的作者,您将在其中找到什么。
另请参阅 Oracle 文档和软件包版本规范Implementation-Version
评论
可以使用命令进行检查java -jar jarname
评论
main()
这个简单的程序将列出 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/
评论
您需要解压缩它并检查其文件,例如META-INF/MANIFEST.MF
unzip -p file.jar | head
或更具体地说:
unzip -p file.jar META-INF/MANIFEST.MF
基本上,您应该使用类加载器来为您提供有关类的信息的类。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
我来晚了,但你可以尝试以下两种方法
使用这些所需的类
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'
评论
Bundle-Version
对于 Linux,请尝试以下操作:
找到。-name “YOUR_JAR_FILE.jar” -exec zipgrep “实现版本:” '{}' \;|awk -F ': ' '{打印 $2}'
评论
zipgrep "Implementation-Version:" JAVA.jar | awk -F ': ' '{print $2}'
如果您有 winrar,请使用 winrar 打开 jar,双击打开文件夹。解压和文件到任何位置(例如桌面)。META-INF
MANIFEST.MF
CHANGES
在文本编辑器中打开提取的文件:您将看到 Implementation-Version 或发布版本。
我以为我会给出一个最近的答案,因为这个问题在搜索中仍然排名很高。
检查CLi JAR版本:
在 CLi jar 文件上运行以下命令:
unzip -p jenkins-cli.jar META-INF/MANIFEST.MF
输出示例:
Manifest-Version: 1.0
Built-By: kohsuke
Jenkins-CLI-Version: 2.210 <--- Jenkins CLI Version
Created-By: Apache Maven 3.6.1
Build-Jdk: 1.8.0_144
Main-Class: hudson.cli.CLI
上面列出了 CLi 版本。
若要获取服务器版本,请运行以下命令:
java -jar ./jenkins-cli.jar -s https://<Server_URL> -auth <email>@<domain>.com:<API Token> version
(以上内容会根据您的身份验证实施情况而有所不同,请相应更改)
输出示例:
Dec 23, 2019 4:42:55 PM org.apache.sshd.common.util.security.AbstractSecurityProviderRegistrar getOrCreateProvider
INFO: getOrCreateProvider(EdDSA) created instance of net.i2p.crypto.eddsa.EdDSASecurityProvider
2.210 <-- Jenkins Server Version
只需使用 .zip 而不是 .jar 重命名扩展名即可。然后转到 META-INF/MANIFEST。MF 并打开 MANIFEST.带有记事本的 MF 文件。您可以在那里找到实现版本。
评论
不涉及提取 JAR 文件的最佳解决方案是运行以下命令。如果 jar 文件不包含清单文件,您将收到“警告:未找到清单文件”
java -jar file.jar -v
您可以执行此脚本,它将在目录中找到所有版本的 jar 文件:
find /directory -maxdepth 3 -name "*.jar" | xargs -l % sh -c "JAR=\"\$(basename % .jar)"; VERSION=\"\$(unzip -q -c % META-INF/MANIFEST.MF | grep 'Implementation-Version' cut -d' ' -f2)\"; echo \"\$JAR \$VERSION\";" | sort
[A] 我们可以手动提取/解压缩 jar 文件,并在 META-INF/MANIFEST 中检查 Bundle-Version 或 Implementation-Version 关键字。MF 文件。
[B] 在 Unix 环境下, 您可以轻松地将 grep 命令与 unzip 和 cut 命令结合使用来获取版本。 [此解决方案确实假设 META-INF/MANIFEST 中会提到版本。分子式 .(80%几率)]
运行以下命令以获取 VERSION.
版本=unzip -p "javaPackage.jar" "META-INF/MANIFEST.MF" | grep -m1 -E "Bundle-Version|Implementation-Version:" | cut -d':' -f2 | awk '{$1=$1;print}' 2>/dev/null
;
解释:
- unzip -> 获取 META-INF/MANIFEST 的内容。MF 文件,这可以在不提取 jar 的情况下完成。
- grep -> 根据 “Bundle-Version” 或 “Implementation-Version:” 关键字搜索匹配词
- cut -> 根据连字符拆分并获取第二部分
- awk -> 修剪 jar-version 周围的空间
- 2>/dev/null -> 重定向到 /dev/null 时出错
注意: - 如果要查找多个jar的版本,请运行for循环并调用上述脚本。
评论