如何检查JAR文件的版本?

how to check the version of jar file?

提问人:Ritesh Mengji 提问时间:4/30/2011 最后编辑:DamienRitesh Mengji 更新时间:6/21/2023 访问量:273997

问:

我目前正在开发一个 J2ME 润色应用程序,只是增强它。我发现很难获得 jar 文件的确切版本。 有没有办法找到类中完成的导入的 jar 文件的版本?我的意思是,如果你有一些东西,导入 x.y.z;我们能知道 jar x.y 包所属的版本吗?

jar 版本 executable-jar

评论


答:

107赞 Vivek 4/30/2011 #1

解压JAR文件并查找清单文件()。JAR 文件的清单文件可能包含版本号(但并不总是指定版本)。META-INF\MANIFEST.MF

评论

0赞 Ritesh Mengji 4/30/2011
正如我所说,我正在努力增强应用程序,我已经下载了 jar 文件,并且我知道 jar 文件的版本。但是我想知道包裹所属的罐子的版本,希望你能得到它。
1赞 Ritesh Mengji 4/30/2011
为了向您解释更多,我有导入 x.y.z,我知道 x.y 属于 a-4.1.jar,但是我正在使用的应用程序已经很久以前开发了,我不知道他们使用了哪个版本的 a.jar 文件,我担心版本,因为某些类已从旧版本的 jar 中贬值(我觉得是这样), 因为,即使我在库中有 jar,我发现导入也无法解析
0赞 Vivek 4/30/2011
那么,如果您知道他们在构建应用程序时使用的 jar 版本,您也会使用相同版本的 jar 来执行应用程序吗?
1赞 Vivek 4/30/2011
如果这是您的要求,那么恐怕您将不得不在排除已弃用的 jar 的情况下重建应用程序。因为查找与给定 jar 关联的版本号就像一对一的功能。一个 jar 文件只有一个版本号。但是,除非开发人员将所需的 jar 附加到应用程序中,否则在开发应用程序时找到使用的 jar 版本对我来说听起来非常不可能。
2赞 Nick.Mc 1/9/2020
MANIFEST 中的录制版本。MF 似乎是可选的。我在 Cognos 中使用的各种文件中没有记录任何版本,但 Cognos 能够报告版本 (4.2.6420.100)。如果此版本未记录在清单中,则从哪里获取此版本?sqljdbc42.jar
19赞 Vadzim 12/23/2011 #2

只是为了完成上面的答案。

清单文件位于 jar 内的路径。META-INF\MANIFEST.MF

您可以在任何支持 zip 的存档器中检查 jar 的内容。

评论

2赞 Thomas Weller 9/9/2015
这个答案(以及其他答案)目前正在 Meta 上讨论
14赞 vijay 4/4/2013 #3

每个 jar 版本都有一个唯一的校验和。您可以计算 jar(没有版本信息)的校验和,并将其与不同版本的 jar 进行比较。我们还可以使用校验和搜索 jar。

请参阅此问题来计算校验和:计算计算机上文件的校验和的最佳方法是什么?

评论

5赞 mik01aj 11/7/2014
我只是计算了 jar md5 并将其粘贴到谷歌。效果很好,非常感谢!
40赞 joth 5/3/2014 #4

只是为了扩展上面的答案,在 META-INF/MANIFEST 中。MF 文件,您可能会看到一行: ←这不是 jar 版本号!Manifest-Version: 1.0

您需要查找哪个(如果存在)是自由文本字符串,因此完全取决于 JAR 的作者,您将在其中找到什么。 另请参阅 Oracle 文档软件包版本规范Implementation-Version

评论

0赞 Thomas Weller 9/9/2015
这个答案(以及其他答案)目前正在 Meta 上讨论
-18赞 Akash Tolia 5/22/2015 #5

可以使用命令进行检查java -jar jarname

评论

10赞 Thomas Weller 9/9/2015
这将运行 JAR 的方法main()
4赞 Shanky_Gupta 12/10/2015 #6

这个简单的程序将列出 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/

评论

0赞 David 5/11/2016
感谢您对 javaxt 的引用,我只是使用了 javaxt.com/Tutorials/Jar/ 中更简单的代码示例......
1赞 David 5/11/2016
仅供参考,对于那些更喜欢 maven 拉取 javaxt-core 而不是下载 JAR 的人来说,您可以执行以下任一方法: gist.github.com/daluu/dda7b29cb5b6e0fbfbaec664eb759739gist.github.com/daluu/52af7eef52563ddf78fe
77赞 kenorb 7/12/2016 #7

您需要解压缩它并检查其文件,例如META-INF/MANIFEST.MF

unzip -p file.jar | head

或更具体地说:

unzip -p file.jar META-INF/MANIFEST.MF
12赞 Donatello 1/19/2017 #8

基本上,您应该使用类加载器来为您提供有关类的信息的类。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

2赞 GetBackerZ 10/19/2017 #9

我来晚了,但你可以尝试以下两种方法

使用这些所需的类

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 详细信息时,这很有效。希望这会有所帮助。

1赞 Sudheer Avula 10/4/2018 #10

您可以使用以下方法从 MANIFEST 文件中筛选版本:

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

评论

0赞 Richlv 7/26/2019
这似乎主要重复了这个较旧的答案 - stackoverflow.com/a/38313502/272387 - 并且不能保证清单有.Bundle-Version
2赞 Bae Cheol Shin 8/10/2019 #11

对于 Linux,请尝试以下操作:

找到。-name “YOUR_JAR_FILE.jar” -exec zipgrep “实现版本:” '{}' \;|awk -F ': ' '{打印 $2}'

评论

1赞 Ivan Chau 3/11/2022
zipgrep "Implementation-Version:" JAVA.jar | awk -F ': ' '{print $2}'
2赞 Ganesan R 10/7/2019 #12

如果您有 winrar,请使用 winrar 打开 jar,双击打开文件夹。解压和文件到任何位置(例如桌面)。META-INFMANIFEST.MFCHANGES

在文本编辑器中打开提取的文件:您将看到 Implementation-Version 或发布版本。

9赞 DC.Skells 12/24/2019 #13

我以为我会给出一个最近的答案,因为这个问题在搜索中仍然排名很高。

检查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
-2赞 Suman Das 3/31/2021 #14

只需使用 .zip 而不是 .jar 重命名扩展名即可。然后转到 META-INF/MANIFEST。MF 并打开 MANIFEST.带有记事本的 MF 文件。您可以在那里找到实现版本。

评论

0赞 FrankM 3/31/2021
你基本上是在复制被接受的答案。
1赞 jmuiruri 1/25/2023 #15

不涉及提取 JAR 文件的最佳解决方案是运行以下命令。如果 jar 文件不包含清单文件,您将收到“警告:未找到清单文件”

java -jar file.jar -v

0赞 Jhonattan Peláez 4/22/2023 #16

您可以执行此脚本,它将在目录中找到所有版本的 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
1赞 Vishy Anand 6/21/2023 #17

[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;

解释:

  1. unzip -> 获取 META-INF/MANIFEST 的内容。MF 文件,这可以在不提取 jar 的情况下完成。
  2. grep -> 根据 “Bundle-Version” 或 “Implementation-Version:” 关键字搜索匹配词
  3. cut -> 根据连字符拆分并获取第二部分
  4. awk -> 修剪 jar-version 周围的空间
  5. 2>/dev/null -> 重定向到 /dev/null 时出错

注意: - 如果要查找多个jar的版本,请运行for循环并调用上述脚本。