如何检查jar文件的版本?
我目前正在开发一个J2ME波兰应用程序,只是在增强它。我发现很难获得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
有没有办法找到在类中完成的导入的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对我来说是非常不可能的,除非开发人员