gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:07:25 24 4
gpt4 key购买 nike

我正在从事一个需要最新 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com