相关疑难解决方法(0)

如何在Java 9中解决java.lang.NoClassDefFoundError:javax/xml/bind/JAXBException

我有一些代码使用JAXB API类,它们是作为Java 6/7/8中JDK的一部分提供的.当我使用Java 9运行相同的代码时,在运行时我得到错误,指示无法找到JAXB类.

自Java 6以来,JAXB类已作为JDK的一部分提供,为什么Java 9不再能够找到这些类?

java jaxb java-9 java-10 java-11

718
推荐指数
27
解决办法
46万
查看次数

使用Java EE API替换已弃用的JPMS模块

Java 9 弃用了六个包含Java EE API的模块,它们很快被删除:

  • javax.activation包的java.activation
  • java.corbajavax.activity,javax.rmi,javax.rmi.CORBA,和org.omg.*
  • javax.transaction包的java.transaction
  • 包含所有javax.xml.bind.*包的java.xml.bind
  • java.xml.wsjavax.jws,javax.jws.soap,javax.xml.soap,和所有javax.xml.ws.*
  • javax.annotation包的java.xml.ws.annotation

哪些维护的第三方工件提供了这些API?它们提供这些API或它们必须提供的其他功能并不重要 - 重要的是,它们是这些模块/包的直接替代品吗?

为了更容易收集知识,我回答了迄今为止我所知道的并将答案作为社区维基.我希望人们能够扩展它,而不是写出自己的答案.


在您投票结束之前:

  • 是的,已经有一些关于单个模块的问题,这个问题的答案当然会复制这些信息.但AFAIK没有任何一点可以了解所有这些,我认为这些有很大的价值.
  • 提出图书馆建议的问题通常被认为是偏离主题的,因为"他们倾向于吸引自以为是的答案和垃圾邮件",但我不认为这适用于此.明确描述了一组有效的库:它们必须实现特定的标准.除此之外别无其他,所以我没有看到很多意见和垃圾邮件的风险.

java java-ee java-9 java-module

150
推荐指数
6
解决办法
5万
查看次数

设置要使用的JAXB上下文工厂初始化类

我已经更新了我们的项目(基于Java EE在Websphere 8.5上运行)以使用公司内部框架的新版本(以及Ejb 3.x部署描述符而不是2.x部署描述符).从那时起,我的集成测试失败,出现以下异常:

 [java.lang.ClassNotFoundException: com.ibm.xml.xlxp2.jaxb.JAXBContextFactory]
Run Code Online (Sandbox Code Playgroud)

我可以使用之前的框架版本构建应用程序,一切正常.调试时我注意到在ContextFinder(javax.xml.bind)中有两种不同的行为:

  1. 以前的版本(一切正常):不同的地方都没有出现工厂类,因此加载了默认的工厂类,即com.sun.xml.internal.bind.v2.ContextFactory(在类中定义为String常量) .

  2. 升级版本(ClassNotFound):成功加载资源"META-INF/services/javax.xml.bind.JAXBContext",第一行读取使ContextFinder尝试加载"com.ibm.xml.xlxp2.jaxb". JAXBContextFactory"导致错误.

我现在有两个问题:

  1. 那资源是什么类型的?因为在我们的EAR中有两个WAR,并且这两个WAR中没有一个在其META-INF目录中包含文件夹服务.

  2. 那个价值在哪里呢?因为一个提交者向我显示没有新的或更改的属性文件.

无需说我将阅读有关JAXB配置可能性的所有内容,但如果您对可能出现的问题有所了解或帮助我使用该资源(这是一个真正的文件,我必须寻找?)id欣赏一个许多.非常感谢!

编辑(根据评论输入/问题):

出于好奇,您的框架是否包含JAXB JAR?您的框架的旧版本是否包含jaxb.properties?

确实(我有点惊讶)框架在EAR中有一个定制的eclipselink-2.4.1-.jar,它包括一个JAXB实现和一个jaxb.properties文件,它在两个版本中显示以下条目(找到的工厂以及抛出异常的工厂):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
Run Code Online (Sandbox Code Playgroud)

我认为这与当前的问题无关,因为jar在两个EAR中都保持完全相同(运行的那个/带有期望的那个)

我也不清楚为什么旧版本的框架选择了com.sun实现

有一个类javax.xml.bind.ContextFinder,它负责初始化JAXBContextFactory.此类搜索各种placess以查找jaxb.properties文件或"javax.xml.bind.JAXBContext"资源的存在.如果所有这些地方都没有显示要使用哪个Context Factory,那么会加载一个在类本身中硬编码的deault工厂:

private static final String PLATFORM_DEFAULT_FACTORY_CLASS = "com.sun.xml.internal.bind.v2.ContextFactory";
Run Code Online (Sandbox Code Playgroud)

现在回到我的问题:

使用先前版本的框架(以及EJB 2.x部署描述符)构建一切正常.在调试时,我可以看到没有找到配置,因此上面提到的默认工厂已加载.

使用新版本的框架(以及我可以部署的EJB 3.x部署描述符)构建仅TESTCASE失败但其余功能正常工作(就像我可以向我们的Web服务发送请求并且它们不会触发任何错误).调试时我可以看到找到了配置.该资源名为"META-INF/services/javax.xml.bind.JAXBContext".以下是此资源如何导致尝试加载"com.ibm.xml.xlxp2.jaxb.JAXBContextFactory"然后抛出ClassNotFoundException的最重要的一行.这是上述javax.xml.bind.ContextFinder类的简化源代码:

URL resourceURL = ClassLoader.getSystemResource("META-INF/services/javax.xml.bind.JAXBContext");

BufferedReader r = new BufferedReader(new InputStreamReader(resourceURL.openStream(), "UTF-8"));

String factoryClassName = r.readLine().trim();  
Run Code Online (Sandbox Code Playgroud)

字段factoryClassName现在具有值'com.ibm.xml.xlxp2.jaxb.JAXBContextFactory'

因为这已经成为一个超级大问题,我还会加上一个赏金:)我将在这整天工作,让你知道是否有任何消息.

更新/解决方案

这个问题已经解决了.原始问题已经发生,因为错误配置了复杂构建的多模型maven项目,其中一个依赖项使用了自定义eclipse链接jar的更新版本,其中包含发生错误的组件中不可用的JAXBFactory的定义.在大多数情况下,设置JAXB上下文工厂是使用包含相同定义的jaxb.propertie文件或JAXBContext文件配置的.适当的JAXBContextFactory的详细加载过程发生在javax.xml.bind.ContextFinder中.

错误尚未解决(事实上超过4个主要EE/SE应用程序导致错误)并且没有一般答案但是定义的JAXBContextFactorys必须存在于您的类路径中(哇多么奇怪......)所以你要么有一个ClassNotFound错误,因为你缺少资源(这就是实际原因),或者因为你在上面提到的任何属性文件中定义了一个错误的JAXBContextFactory,其中包含根据以下答案的定义.

非常感谢您的好评和支持,我真的很感激!

java websphere jaxb

7
推荐指数
1
解决办法
4万
查看次数

标签 统计

java ×3

java-9 ×2

jaxb ×2

java-10 ×1

java-11 ×1

java-ee ×1

java-module ×1

websphere ×1