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

问题描述 投票:2回答:1

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

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

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

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

java xml maven xml-parsing jaxb
1个回答
0
投票

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

要覆盖默认的jaxb实现,您需要实现自定义类加载器或将运行时类加载器模式配置为“父级最后”。默认为“父优先”,它优先于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));
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.