[英]Unable to get version for stax2 java package
我试图找到在我的环境中加载的stax2-api。 为了解决该问题,我试图编写一个示例代码,该示例代码可以与java.lang包一起正常工作,但不能与org.codehaus.stax2一起工作。 我的问题是为什么示例代码无法与org.codehaus.stax2一起使用?
工作代码
import org.codehaus.stax2.*;
public class Test {
public static void main(String[] args) {
Package p = Package.getPackage("java.lang");
System.out.println(p.getSpecificationVersion());
System.out.println(p.getImplementationVersion());
}
}
输出:
$ javac -cp ".:$STAX2_JAR_FILE" Test.java
$ java -cp ".:$STAX2_JAR_FILE" Test
1.8
1.8.0_171
但是为org.codehaus.stax2运行相同的代码失败
不起作用的代码:
import org.codehaus.stax2.*;
public class Test {
public static void main(String[] args) {
Package p = Package.getPackage("org.codehaus.stax2");
System.out.println(p.getSpecificationVersion());
System.out.println(p.getImplementationVersion());
}
}
输出:
$ javac -cp ".:$STAX2_JAR_FILE" Test.java
$ java -cp ".:$STAX2_JAR_FILE" Test
Exception in thread "main" java.lang.NullPointerException
at Test.main(Test.java:5)
您不能直接提取属于stax2-api而不属于Java本机库的org.codehaus.stax2的软件包清单信息。 因此,您只需阅读stax2-api.jar的清单,该清单应在项目的类路径中可用。 您可以按照以下方法进行操作:
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Enumeration;
import java.util.jar.Attributes;
import java.util.jar.JarFile;
import java.util.jar.Manifest;
public class StaxDemo {
// This method reads manifest data from a JAR file and shows its information
public static void main(String[] args) {
Enumeration resourcesEnum;
try {
resourcesEnum = Thread.currentThread().getContextClassLoader().
getResources(JarFile.MANIFEST_NAME);
while (resourcesEnum.hasMoreElements()) {
try {
URL url = (URL) resourcesEnum.nextElement();
if (url.toString().contains("stax2-api-3.0.1.jar")) {
InputStream inputStream = url.openStream();
if (inputStream != null) {
Manifest manifest = new Manifest(inputStream);
Attributes mainAttribs = manifest.getMainAttributes();
String specificationVersion =
mainAttribs.getValue("Specification-Version");
String implementationVersion =
mainAttribs.getValue("Implementation-Version");
if (specificationVersion != null && implementationVersion !=
null) {
System.out.println("Specification Version : " +
specificationVersion);
System.out.println("Implementation Version : " +
implementationVersion);
}
}
}
} catch (Exception e) {
// handle
}
}
} catch (IOException e1) {
// handle
}
}
该代码将产生以下输出:
Specification Version : 3.0.1
Implementation Version : 3.0.1
该代码遍历了类路径中存在的所有JAR。 因此,我过滤了所需的JAR。 您可以根据需要进行更改。 希望这可以帮助 !!!
阿曼的答案有效,但我发现我可以使用jar命令提取清单文件,然后使用grep在清单文件中进行捆绑版本。 以下是命令:
$ jar xf $STAX2_JAR_FILE META-INF/MANIFEST.MF
$ grep Bundle-Version META-INF/MANIFEST.MF
Bundle-Version: 3.1.4
我最终在命令行上使用jar命令查找版本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.