java - 使用 ForkJoinPool Java 找不到 JAXB 类

标签 java jaxb forkjoinpool

我使用 jaxb 进行解码,但是当我使用 ForkJoinPool execute() 方法时,我得到一个“java.log.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory”,但我确定我的运行时类路径中的存在,因为当我不使用 ForkJoinPool 时它可以正常工作......你知道问题或解决方法吗?

我使用 Java 11

我的代码:

ForkJoinPool commonPool = ForkJoinPool.commonPool();
        commonPool.execute(() -> {
            try {
                String messageFileContent = Files.readString(Paths.get(
                        this.getClass().getClassLoader().getResource("xml-to-process.xml").getPath()));

                JAXBContext jaxbContext = JAXBContext.newInstance(ObjectFactory.class);
                Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
                // avoiding schema validation for more performance
                jaxbUnmarshaller.setSchema(null);
                UpdateWorkOrder updateWorkOrder = (UpdateWorkOrder) jaxbUnmarshaller.unmarshal(new StringReader(messageFileContent));
            } catch (Exception e) {
                e.printStackTrace();
            }
        });

这很奇怪不是...?在 ForkJoinPool 的 execute() 之外,解析是正确的。

错误是:

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]
java.base/java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinTask.doExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.scan(Unknown Source)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(Unknown Source)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(Unknown Source)
Caused by: java.lang.ClassNotFoundException: com.sun.xml.internal.bind.v2.ContextFactory
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(Unknown Source)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(Unknown Source)
at java.base/java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.bind.ServiceLoaderUtil.nullSafeLoadClass(ServiceLoaderUtil.java:92)
at javax.xml.bind.ServiceLoaderUtil.safeLoadClass(ServiceLoaderUtil.java:125)
at javax.xml.bind.ContextFinder.newInstance(ContextFinder.java:230)

最佳答案

如果 ForkJoinPool 使用的 ClassLoader 与您的应用程序不同,则可能会发生这种情况,特别是如果您使用的是 Tomcat 等 Web 容器。

您可以尝试为您的 ForkJoinPool 设置线程工厂,并在该工厂中,将创建的线程的上下文类加载器设置为正确的应用程序类加载器。

关于java - 使用 ForkJoinPool Java 找不到 JAXB 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66393004/

相关文章:

java - 在一组文档上使用 ForkJoinPool

java - ForkJoinPool 与普通递归

java - JAXB 将多个对象编码到一个文件

java - MOXy JAXB 在 XmlIDREF 上中断为具有枚举属性的类型

java - Fork Join 池挂起

Java参数具有不同的静态和动态类型?

java - 如何建立与DVR的连接并解码数据?

java - Jsp servlet异常

java - CRest日志请求/响应体

jaxb - OpenJDK JAXB 实现中奇怪的 NullPointerException 捕获