В нашем приложении мы иногда получаем следующее исключение:
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
не знает о наших зависимостях?