我有一个纯 e4 应用程序,希望它能在 Java 11 中工作。
我有一个插件,它提供了可供我们的产品使用的库。我已将最新的 JAXB 库添加到插件的 MANIFEST.MF
和 .classpath
中。
插件 MANIFEST.MF
Bundle-ClassPath:
...
jakarta.activation-api-1.2.1.jar,
jakarta.xml.bind-api-2.3.2.jar,
jaxb-osgi-2.3.2.jar,
...
Export-Package:
...
com.sun.xml.bind,
com.sun.xml.bind.v2,
...
插件.classpath
...
<classpathentry exported="true" kind="lib" path="jakarta.activation-api-1.2.1.jar"/>
<classpathentry exported="true" kind="lib" path="jakarta.xml.bind-api-2.3.2.jar"/>
<classpathentry exported="true" kind="lib" path="jaxb-osgi-2.3.2.jar"/>
...
产品 MANIFEST.MF
Bundle-ClassPath:
...
NameOfPlugin;bundle-version="1.0.0",
...
Import-Package:
...
com.sun.xml.bind.v2,
...
产品.classpath
...
<classpathentry exported="true" kind="lib" path="jakarta.activation-api-1.2.1.jar"/>
<classpathentry exported="true" kind="lib" path="jakarta.xml.bind-api-2.3.2.jar"/>
<classpathentry exported="true" kind="lib" path="jaxb-osgi-2.3.2.jar"/>
...
运行配置
我已经更新了应用程序的 JVM 选项。
-Djavax.xml.bind.JAXBContextFactory=com.sun.xml.bind.v2.ContextFactory
异常
java.util.concurrent.ExecutionException: 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.bind.v2.ContextFactory]
at com.google.common.util.concurrent.AbstractFuture.getDoneValue(AbstractFuture.java:552)
at com.google.common.util.concurrent.AbstractFuture.get(AbstractFuture.java:513)
at com.google.common.util.concurrent.AbstractFuture$TrustedFuture.get(AbstractFuture.java:90)
at com.google.common.util.concurrent.Uninterruptibles.getUninterruptibly(Uninterruptibles.java:199)
at com.google.common.cache.LocalCache$Segment.getAndRecordStats(LocalCache.java:2312)
at com.google.common.cache.LocalCache$Segment.loadSync(LocalCache.java:2278)
at com.google.common.cache.LocalCache$Segment.lockedGetOrLoad(LocalCache.java:2154)
at com.google.common.cache.LocalCache$Segment.get(LocalCache.java:2044)
at com.google.common.cache.LocalCache.get(LocalCache.java:3952)
at com.google.common.cache.LocalCache.getOrLoad(LocalCache.java:3974)
at com.google.common.cache.LocalCache$LocalLoadingCache.get(LocalCache.java:4958)
at com.ci.data.reports.ReportFileManager.getAllQueryFromFile(ReportFileManager.java:81)
at com.ci.data.reports.ReportFileManager.lambda$getAllQueryFromFiles$11(ReportFileManager.java:321)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:195)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:952)
at java.base/java.util.stream.ReduceOps$ReduceTask.doLeaf(ReduceOps.java:926)
at java.base/java.util.stream.AbstractTask.compute(AbstractTask.java:327)
at java.base/java.util.concurrent.CountedCompleter.exec(CountedCompleter.java:746)
at java.base/java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:290)
at java.base/java.util.concurrent.ForkJoinPool$WorkQueue.topLevelExec(ForkJoinPool.java:1020)
at java.base/java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1656)
at java.base/java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1594)
at java.base/java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:177)
为什么找不到ContextFactory
类?
最佳答案
从您列出的 JAR 中,我认为您只包含了 JAXB API,但没有包含 JAXB 实现。
请记住,Java 11 完全删除了 JAXB,从而破坏了向后兼容性。您需要检查类路径上的任何 JAR 是否实际上包含类 com.sun.xml.bind.v2.ContextFactory
。
您可能需要类似 org.glassfish.jaxb:jaxb-runtime 的东西 jar 。
关于java - Eclipse e4 应用程序 - 包含在插件中时未找到 ContextFactory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59213260/