java - 如何通过 Maven 覆盖默认的 JAXB 版本?

标签 java xml maven xml-parsing jaxb

我正在从事一个需要最新 JAXB 的项目。我正在使用作为外部库包含的 Java JDK 1.8。

显然,JAXB (xml.bind) 与此 JDK 捆绑在一起(在名为 resources.jar 的应用程序下),而不是在我的项目的 pom.xml 中。首先,我不知道 JDK 中实际包含什么版本 - 我如何确认这一点?

其次,我想保证当我在我的 Maven 中为我的 pom.xml 中的最新 JAXB 添加依赖项时,不使用旧版本。我怎么能有这个保证?

如果有任何帮助,我正在使用 IntelliJ IDEA。

最佳答案

Maven 是一个构建工具,因此您不能使用 Maven 更改或选择运行时实现。 Maven 使用在 pom.xml 中找到的依赖项来编译 项目。在运行时,类由 java classloader 选择。

要覆盖默认的 jaxb 实现,您需要实现自定义类加载器或将运行时类加载器模式配置为“parent last”。默认是“parent first”,它优先于 JDK 类。

如何执行此操作取决于您的运行时环境。例如,IBM Websphere AS 在管理控制台中有一个选项来选择类加载器模式。

一篇关于类加载器以及如何实现自定义类加载器的好文章:https://www.baeldung.com/java-classloaders

在运行时获取详细信息的代码片段:

/**
 * Usage: ClassDetails.print(JAXB.class);
 */
public class ClassDetails {

    public static void print(Class<?> clazz) {

        String apiDetails = String.format("%s - %s (%s)",
                clazz.getPackage().getSpecificationTitle(),
                clazz.getPackage().getSpecificationVendor(),
                clazz.getPackage().getSpecificationVersion());

        String implDetails = String.format("%s - %s (%s)",
                clazz.getPackage().getImplementationTitle(),
                clazz.getPackage().getImplementationVendor(),
                clazz.getPackage().getImplementationVersion());

        String classloader = clazz.getClassLoader() != null ?
                clazz.getClassLoader().toString() : "bootstrap";

        println("Class name", clazz.getCanonicalName());
        println("API details", apiDetails);
        println("Implementation", implDetails);
        println("Classloader", classloader);
    }

    private static void println(String label, String value) {
        System.out.println(String.format("%-16s: %s", label, value));
    }
}

关于java - 如何通过 Maven 覆盖默认的 JAXB 版本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54955059/

相关文章:

sql-server - 使用同名元素解析 OpenXML

python - XML:如何通过属性值获取元素 - Python 2.7 和 minidom

java - 错误 : java: package org. springframework.boot 不存在

java - 示例 "mavenproject"netbeans 7.4 的包 javafx 不存在

java - Maven项目: Failed to read artifact descriptor

java - 如何将 java.net.Socket 传递给等待 `BoostSocket.assign(tcp::v4(), nativeSocketFromJava);` 的 C++ DLL 函数

xml - 从 XSLT 1.0 中的字符串中提取多个子字符串

Java 源而不是 Maven 目标目录中的类文件

java - 如何从 RAM 内存中存储和加载类?

java - 如何切换二维数组中的两列?