【发布时间】:2014-01-24 15:04:45
【问题描述】:
我已经编译了我的 xsd 文档并开始为我的包装器编写 junit 测试。
当我调用 marshal 时,我得到下面的堆栈跟踪。我很惊讶没有找到一个日食课程。 (org.eclipse.persistence.jaxb.JAXBContextFactory)
我的类路径中缺少什么?还是我还缺少其他东西?
我正在运行 eclipse indigo 3.7.2。
我的类路径包括以下罐子: jaxb-api.jar, jaxb-impl.jar, jaxb-xjc.jar, jaxb1impl.jar, jsr173_1.0_api.jar,
我的编译器设置为 java 6 兼容性。
1 [main] WARN com.bellsouth.snt.cnmp.dao.csp.CspInputMarshaller - Cannot marshal xml data
javax.xml.bind.JAXBException: Provider org.eclipse.persistence.jaxb.JAXBContextFactory not found
- with linked exception:
[java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory]
at javax.xml.bind.ContextFinder.newInstance(Unknown Source)
at javax.xml.bind.ContextFinder.find(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at javax.xml.bind.JAXBContext.newInstance(Unknown Source)
at com.bellsouth.snt.cnmp.dao.csp.CspInputMarshaller.jaxbMarshal(CspInputMarshaller.java:69)
at com.bellsouth.snt.cnmp.dao.csp.CspInputMarshaller.marshal(CspInputMarshaller.java:46)
at com.bellsouth.snt.cnmp.dao.csp.CspInputMarshallerTest.testGetUserRequest(CspInputMarshallerTest.java:25)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at junit.framework.TestCase.runTest(TestCase.java:164)
at junit.framework.TestCase.runBare(TestCase.java:130)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:120)
at junit.framework.TestSuite.runTest(TestSuite.java:230)
at junit.framework.TestSuite.run(TestSuite.java:225)
at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.lang.ClassNotFoundException: org.eclipse.persistence.jaxb.JAXBContextFactory
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at javax.xml.bind.ContextFinder.safeLoadClass(Unknown Source)
... 26 more
更新:手动解决方法 缺少的 jar 文件是 jaxb-impl.jar 它在我的类路径中,包含在 ear 项目中的 jar 中。如果我在默认类路径之前的类路径中添加 jaxb-impl.jar。它运行良好。
在我同一个工作区的其他项目中,我没有这个问题。
【问题讨论】:
-
不管你怎么想,
org.eclipse.persistence.jaxb.JAXBContextFactory从你的类路径中消失了。java.lang.ClassNotFoundException从不撒谎。 -
您缺少的类是 EclipseLink MOXy 的一部分。 MOXy 是 JAXB 的替代实现。虽然它是 Eclipse 项目系列的一部分,但 MOXy 与 Eclipse IDE 不同。您是否使用 jaxb.properties 文件将 specify MOXy 作为您的 JAXB 实现?
-
@John R 我没有指定我的 jaxb 实现。我没有 jaxb.properties 文件。也许这是我的问题。
-
这可能是类路径问题。你是如何构建你的项目的?你从哪里得到你正在使用的 jaxb-api.jar 和 jaxb-impl.jar?
-
我从同事创建的另一个项目中复制了 jar。我在eclipse中用ant编译了xsd。我正在从 junit 测试中调用代码。