【发布时间】:2019-08-22 11:32:56
【问题描述】:
在我们的应用程序中,我们有时会遇到以下异常:
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 怎么可能不知道我们的依赖关系?
【问题讨论】:
标签: java jaxb classloader java-11