如何检查jar文件的版本?

如何检查jar文件的版本?,jar,version,executable-jar,Jar,Version,Executable Jar,我目前正在开发一个J2ME波兰应用程序,只是在增强它。我发现很难获得jar文件的确切版本。 有没有办法找到在类中完成的导入的jar文件的版本?我的意思是如果你有什么东西,输入x.y.z;我们可以知道jar x.y包的版本属于哪个版本吗?解压缩jar文件并查找清单文件(META-INF\manifest.MF)。JAR文件的清单文件可能包含一个版本号(但并不总是指定一个版本)。只需完成上述回答即可 清单文件位于jar内部的META-INF\Manifest.MF路径 您可以在任何支持zip的arc

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

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

只需完成上述回答即可

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


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

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

请参阅此问题以计算校验和:

仅扩展上面的答案,在JAR中的META-INF/MANIFEST.MF文件中,您可能会看到一行:
清单版本:1.0
← 这不是jar版本号

您需要查找
实现版本
,如果存在,它是一个自由文本字符串,完全取决于JAR的作者,您可以在其中找到什么。
另请参见和

可以使用命令
java-jarjarname
检查它。这个简单的程序将列出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);
    
    Map jarsWithVersionFound=newlinkedhashmap();
    List jarsWithNoManifest=newlinkedlist();
    List jarsWithNoVersionFound=newlinkedlist();
    //循环浏览lib文件夹中的文件
    //逐个选择一个jar并获取版本()
    //在控制台中打印..保存到文件(?)…可能稍后
    File[]files=新文件(“路径到文件夹”).listFiles();
    用于(文件:文件)
    {
    字符串文件名=file.getName();
    尝试
    {
    String jarVersion=new Jar(file).getVersion();
    if(jarVersion==null)
    jarsWithNoVersionFound.add(文件名);
    其他的
    jarsWithVersionFound.put(文件名,jarVersion);
    }
    捕获(例外情况除外)
    {
    jarsWithNoManifest.add(文件名);
    }
    }
    System.out.println(“*******JARs,找到的版本为*******”;
    for(条目jarName:jarsWithVersionFound.entrySet())
    System.out.println(jarName.getKey()+”:“+jarName.getValue());
    System.out.println(“\n\n**********未找到版本的JAR*******”;
    for(字符串jarName:jarsWithNoVersionFound)
    System.out.println(jarName);
    System.out.println(“\n\n**********未找到清单的JAR*******”;
    for(字符串jarName:jarsWithNoManifest)
    System.out.println(jarName);
    

它使用javaxt核心jar,可以从下载您需要解压缩它并检查其
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使用这个特性可以在其生成的stacktraces中跟踪每个类的JAR名称/版本


另请参见

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

使用这些必需的类

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详细信息时,这种方法非常有效。希望这有帮助。

您可以使用


解压-p my.jar META-INF/MANIFEST.MF | grep“Bundle Version”
对于Linux,请尝试以下操作:

java -jar ./jenkins-cli.jar -s https://<Server_URL> -auth <email>@<domain>.com:<API Token> version

找到-名称为“YOUR_JAR_FILE.JAR”-exec zipgrep“实现版本:“{}”|awk-F':''{print$2}'

如果你有winrar,用winrar打开jar,双击打开文件夹
META-INF
。将
MANIFEST.MF
更改文件提取到任何位置(比如桌面)


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

我想我会给出一个更新的答案,因为这个问题在搜索中仍然很常见

正在检查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
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
清单版本:1.0
建造人:kohsuke

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

正如我所说,我正在致力于增强应用程序,我已经下载了jar文件,我知道jar文件的版本。但是我想知道这个包所属的jar的版本,我希望你能理解。为了进一步解释,我已经导入了x.y.z,我知道x.y属于a-4.1.jar,但是我正在工作的应用程序已经开发很久了,我不知道他们使用了什么版本的a.jar文件,我担心这个版本,因为,一些类已经从旧版本的jar中贬值了(我觉得是这样),因为,即使我在库中有jar,我发现导入无法解析。所以,如果您知道构建应用程序时使用的jar版本,您还将使用相同版本的jar来执行应用程序?如果这是您的需求,那么恐怕您将不得不重新构建应用程序,排除不推荐使用的jar。因为查找与给定jar关联的版本号类似于一对一函数。一个jar文件只有一个版本号。但是,在开发应用程序时发现使用了哪个版本的jar对我来说是非常不可能的,除非开发人员