【问题标题】:How to override the default JAXB version via Maven?如何通过 Maven 覆盖默认的 JAXB 版本?
【发布时间】:2019-03-02 03:54:02
【问题描述】:

我正在开发一个需要最新 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】:

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

    要覆盖默认的 jaxb 实现,您需要实现自定义类加载器或将运行时类加载器模式配置为“最后一个父级”。默认是“父优先”,它优先于 JDK 类而不是其他所有类。

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

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

    代码 sn-p 在运行时获取详细信息:

    /**
     * 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));
        }
    }
    

    【讨论】:

    • 感谢您的回答。知道如何在没有任何编程的情况下配置类加载器(至少是它的模式)吗?我在本地运行一个 jar 应用程序。
    • 对不起,我不知道。据我所知,这是无法做到的。我认为你的三个要求太高了,你只需要选择两个:Java 8 / 最新的 JAXB / 没有额外的代码
    猜你喜欢
    • 1970-01-01
    • 2017-01-29
    • 2019-07-07
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2013-07-29
    • 2011-01-19
    • 2012-10-26
    相关资源
    最近更新 更多