我目前正在研究J2ME打磨应用程序,只是增强它。我发现很难获得jar文件的确切版本。 有没有办法找到在类中进行的导入的jar文件的版本?我的意思是如果你有一些东西,导入x.y.z;我们可以知道jar x.y包所属的版本吗?
答案 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 docs和Package 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版本的所有案例
找不到清单文件
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.MF
和CHANGES
文件提取到任何位置(例如,桌面)。
在文本编辑器中打开提取的文件:您将看到“实施版本”或发行版本。
答案 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