如何检查jar文件的版本?

我目前正在研究一个J2ME波兰应用程序,只是加强它。 我发现很难得到jar文件的确切版本。 有什么办法来find在类中进行的导入的jar文件的版本? 我的意思是如果你有一些东西,importxyz; 我们可以知道jar xy包所属的版本吗?

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

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

清单文件位于META-INF\MANIFEST.MFpath的jar文件中。

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

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

 unzip -p file.jar | head 

或更具体的:

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

只要展开上面的答案,在JAR中的META-INF / MANIFEST.MF文件中,您将可能看到一行: Manifest-Version: 1.0 ←这不是 jar版本号!

您需要查找Implementation-Version ,如果存在的话,它是一个自由文本string,完全由JAR的作者决定,您可以在这里find。 另请参阅Oracle文档和软件包版本说明

每个jar版本都有独特的校验和。 你可以为你的jar(没有版本信息)计算校验和,并将其与不同版本的jar进行比较。 我们也可以使用校验和search一个jar文件。

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

这个简单的程序将列出所有的jar版本的情况

  • 在Manifest文件中find的版本
  • 没有在Manifest中find的版本,甚至从jar名称
  • 清单文件未find

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

它使用可从http://www.javaxt.com/downloads/下载的javaxt-core jar

基本上你应该使用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细节时,这个效果很好。 希望这可以帮助。

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