如何检查jar文件的版本?

时间:2011-04-29 16:36:18

标签: jar version executable-jar

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

14 个答案:

答案 0 :(得分:61)

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

答案 1 :(得分:36)

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

unzip -p file.jar | head

或更具体:

unzip -p file.jar META-INF/MANIFEST.MF

答案 2 :(得分:24)

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

你需要查找Implementation-Version,如果存在的话,它是一个自由文本字符串,完全取决于JAR的作者关于你在那里找到的内容。 另请参阅Oracle docsPackage Version specificaion

答案 3 :(得分:17)

只是为了完成上述答案。

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

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

答案 4 :(得分:11)

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

参考此问题计算校验和: What is the best way to calculate a checksum for a file that is on my machine?

答案 5 :(得分:5)

基本上你应该使用使用类加载器的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

答案 6 :(得分:3)

这个简单的程序将列出jar版本的所有案例

  • 在清单文件中找到的版本
  • 在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);
    

它使用javaxt-core jar,可以从http://www.javaxt.com/downloads/

下载

答案 7 :(得分:1)

我迟到了,但您可以尝试以下两种方法

使用这些所需的课程

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

答案 8 :(得分:1)

您可以使用

从清单文件中过滤版本

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

答案 9 :(得分:1)

如果您具有winrar,请用winrar打开jar,双击以打开文件夹META-INF。将MANIFEST.MFCHANGES文件提取到任何位置(例如,桌面)。

在文本编辑器中打开提取的文件:您将看到“实施版本”或发行版本。

答案 10 :(得分:0)

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

查找。 -name“ YOUR_JAR_FILE.jar” -exec zipgrep“ Implementation-Version:”'{}'\; | awk -F':''{print $ 2}'

答案 11 :(得分:0)

我想给出一个更新的答案,因为这个问题在搜索中仍然占很高的比例。

检查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

答案 12 :(得分:-1)

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

答案 13 :(得分:-11)

可以使用命令java -jar jarname

进行检查