我试图找到在我的环境中加载的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。您可以根据需要进行更改。希望这可以帮助 !!!

关于java - 无法获取stax2 java软件包的版本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52143685/

10-12 04:28