parallelStream () вызывая ClassNotFoundException с JAXB-API - PullRequest
3 голосов
/ 01 апреля 2019

В нашем приложении мы иногда получаем следующее исключение:

javax.xml.bind.JAXBException: Implementation of JAXB-API has not been found on module path or classpath.
 - with linked exception:
[java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory]

Мы уже обнаружили, что это происходит, только если мы используем Collection.parallelStream(), но не если мы используем Collection.stream().

Мы видели, что JAXB использует Thread.currentThread().getContextClassLoader() для загрузки классов.Мы также увидели, что при использовании parallelStream() потоки для выполнения нашей команды используют разные загрузчики классов.Иногда это org.apache.catalina.loader.WebappClassLoader, а иногда jdk.internal.loader.ClassLoaders.AppClassLoader.

И теперь кажется, что AppClassLoader не знает о зависимостях JAXB, тогда как WebappClassLoader знает.

Мы используем Java 11 и следующие зависимости Maven:

<dependency>
    <groupId>javax.xml.bind</groupId>
    <artifactId>jaxb-api</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish.jaxb</groupId>
    <artifactId>jaxb-runtime</artifactId>
    <version>2.3.1</version>
</dependency>
<dependency>
    <groupId>javax.activation</groupId>
    <artifactId>activation</artifactId>
    <version>1.1.1</version>
</dependency>

Есть идеи, что может быть не так?Как может быть, что AppClassLoader не знает о наших зависимостях?

1 Ответ

0 голосов
/ 19 июля 2019

У меня была похожая проблема, когда я получал ClassNotFoundException для org.apache.xerces.parsers.SAXParser. Я удалил / исключил зависимости для xercesImpl, xml-api, xmlbeans, xmlschema-core, и проблема решена, хотя я понятия не имею, почему и как она работала. То, что побудило меня удалить эти банки, было XMLReaderFactory, который присутствовал в JDK 8 и xml-api.

...