我目前正在开发J2ME波兰语应用程序,只是对其进行了增强。我发现很难获得jar文件的确切版本。有什么方法可以为该类中的导入找到jar文件的版本吗?我的意思是,如果您有东西,请输入xyz;我们可以知道jar xy包所属的版本吗?
我目前正在开发J2ME波兰语应用程序,只是对其进行了增强。我发现很难获得jar文件的确切版本。有什么方法可以为该类中的导入找到jar文件的版本吗?我的意思是,如果您有东西,请输入xyz;我们可以知道jar xy包所属的版本吗?
Answers:
解压缩JAR文件并查找清单文件(META-INF\MANIFEST.MF
)。JAR文件的清单文件可能包含版本号(但不一定总是指定版本)。
sqljdbc42.jar
我与Cognos一起使用过的各种文件中都没有记录版本,但是Cognos能够报告版本(4.2.6420.100)。如果清单中未记录该版本,它将从何处获得该版本?
只是为了完成以上答案。
清单文件位于jar的META-INF\MANIFEST.MF
路径内。
您可以在任何支持zip的存档器中检查jar的内容。
每个jar版本都有唯一的校验和。您可以为您的jar(没有版本信息)计算校验和,并将其与jar的不同版本进行比较。我们还可以使用校验和搜索一个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
这个简单的程序将列出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/下载
我迟到了,但是您可以尝试以下两种方法
使用这些所需的类
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详细信息时,此方法效果很好。希望这可以帮助。
您可以使用以下方式从清单文件中过滤版本
unzip -p my.jar META-INF/MANIFEST.MF | grep 'Bundle-Version'
Bundle-Version
。
我想我会提供一个更新的答案,因为这个问题在搜索中仍然占很高的比例。
检查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