java - 如何通过 Maven 覆盖默认的 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 实现,您需要实现自定义类加载器或将运行时类加载器模式配置为“最后一个父级”。默认值为“父优先”,它优先于 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));
}
}
推荐阅读
- xml - XSD 歧义,同一复杂类型中的多个合成器
- python - 有没有办法将 networkx 图形细节作为 PIL 图像获取?
- python - 在新数据集上应用 CNN .h5 格式模型
- sql - SQL 来合并我的行?尝试使用 MAX,没有按预期工作。需要抓取最新的行,以及忽略 NULL
- vba - 没有类名的 VBA API Findwindowex 失败
- ruby-on-rails - 有没有更好的方法在 Rails 中实现我的业务逻辑?
- reactjs - Redux 不适用于 iOs 设备测试的 expo 应用程序
- django - 从heroku中提取更改的数据
- c++ - 如何从 BGR 框架 opencv C++ 获取红色通道
- c++11 - 为什么不包含 initializer_list 头文件时没有编译错误?