Как заменить --add-modules java.xml.ws

Я перенес свой проект на основе Maven на SpringBoot 2.0 и Java 9. В процессе мне пришлось добавить некоторые зависимости, чтобы избавиться от предупреждений Java 9 о модулях (которые все еще можно добавить с помощью --add-modules).

Однако я не могу избавиться от --add-modules java.xml.ws. Как предложено в JEP 320, добавление зависимостей:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-impl</artifactId>
    <version>2.3.0</version>
</dependency>
<dependency>
    <groupId>com.sun.xml.bind</groupId>
    <artifactId>jaxb-core</artifactId>
    <version>2.3.0</version>
</dependency>

Эти зависимости позволяют запустить mvn test для запуска. Сборка из IntelliJ IDE тоже работает.

Однако при запуске приложения Spring Boot я получаю следующее исключение времени выполнения:

...
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
    at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
    at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
    at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
    at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:122)
    at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:155)
    at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:174)
    ... 64 more

Какие зависимости Maven мне не хватает? JarFinder говорит мне, что класс реализации часть jaxb-impl, но только до версии 2.2.12. Так куда же пропала эта реализация?


person hotzst    schedule 25.03.2018    source источник
comment
Возможно, вы используете, например. устаревшая майка, для которой нужен ContextFactory?   -  person Krzysztof Krasoń    schedule 26.03.2018


Ответы (1)


Вам также понадобится jaxb-runtime:

    <dependency>                                                            
        <groupId>org.glassfish.jaxb</groupId>                               
        <artifactId>jaxb-runtime</artifactId>                               
        <version>2.3.0</version>                                            
    </dependency> 

И я не думаю, что вам нужна какая-либо из зависимостей com.sun, используйте для реализации стеклянную рыбу:

    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-runtime</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.glassfish.jaxb</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>

В качестве примечания, я думаю, что хорошо иметь хотя бы один интеграционный тест (отказоустойчивый maven), который запускает контекст Spring. Если он у вас будет, убедитесь, что вы используете как минимум surefire и failsafe 2.21.0 (в предыдущей версии была ошибка с --add-modules).

person Krzysztof Krasoń    schedule 26.03.2018
comment
Добавление этого модуля вызывает только другое исключение: java.lang.NoClassDefFoundError: com/sun/xml/bind/v2/model/annotation/AnnotationReader. По какой-то причине классы пытаются загрузить что-то из com.sun.xml.bin.v2 - person hotzst; 02.05.2018
comment
Я добавил новый вопрос с более полным примером: определяющий-дополнительный" title="правильный способ использования spring jaxb marshaller с java 9 без определения дополнительного"> stackoverflow.com/questions/50139996/ - person hotzst; 02.05.2018