如何检查 jar 文件的版本?

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

247156 次浏览

Decompress the JAR file and look for the manifest file (META-INF\MANIFEST.MF). The manifest file of JAR file might contain a version number (but not always a version is specified).

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

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

您可以在任何支持 zip 的归档程序中检查 jar 的内容。

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

参考以下问题计算校验和: 计算机上文件校验和的最佳方法是什么?

为了展开上面的答案,在 JAR 中的 META-INF/MANIFEST.MF 文件中,您可能会看到一行: Manifest-Version: 1.0赚这是 没有的 JAR 版本号!

您需要查找 Implementation-Version,如果有的话,它是一个自由文本字符串,完全取决于 JAR 的作者,以至于您可以在其中找到什么。 另请参阅 Oracle docs和 < a href = “ http://docs.oracle.com/javase/8/docs/techtes/guide/versioning/spec/versioning2.html # wp89936”> 包版本规范

可以用命令 java -jar jarname检查它

This simple program will list all the cases for version of jar namely

  • 在 Manifest 文件中找到版本
  • 在 Manifest 中甚至在 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);
    

It uses the javaxt-core jar which can be downloaded from 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'

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

- name“ YOUR _ JAR _ FILE.jar”-exec zipgrep“实现-版本:”’{}’; | awk-F’:’{ print $2}’

If you have winrar, open the jar with winrar, double-click to open folder META-INF. Extract MANIFEST.MF and CHANGES files to any location (say desktop).

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

Thought I would give a more recent answer as this question still comes up pretty high on searches.

Checking CLi JAR Version:

在 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

重命名扩展名。拉上拉链。罐子。然后转到 META-INF/MANIFEST.MF,用记事本打开 MANIFEST.MF 文件。您可以在那里找到实现版本。