Как переопределить версию JAXB по умолчанию через Maven? - PullRequest
0 голосов
/ 02 марта 2019

Я работаю над проектом, который требует последней версии JAXB.Я использую Java JDK 1.8, включенный в качестве внешней библиотеки.

Очевидно, JAXB (xml.bind) связан с этим JDK (в приложении под названием resources.jar), а не в моем pom.xml для моего проекта.,Во-первых, я не знаю, какая версия на самом деле включена в JDK - как я могу это подтвердить?

Во-вторых, я хотел бы иметь гарантию, что когда я добавлю зависимость в свой Maven дляпоследний JAXB в моем pom.xml, более старая версия не используется.Как я могу получить эту гарантию?

Я использую IntelliJ IDEA, если она мне поможет.

1 Ответ

0 голосов
/ 02 марта 2019

Maven - это инструмент для сборки, поэтому вы не можете изменить или выбрать реализацию во время выполнения с помощью maven.Maven использует зависимости, найденные в pom.xml, для компиляции проекта.В runtime классы выбираются 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));
    }
}
...