XML 代码运行正常,但 junit 因 NoClassDefFound 而失败

Posted

技术标签:

【中文标题】XML 代码运行正常,但 junit 因 NoClassDefFound 而失败【英文标题】:The XML code runs properly, but junit fails with NoClassDefFound 【发布时间】:2009-02-06 19:02:38 【问题描述】:

我正在将我的环境从 eclipse 3.3.1 和 java 1.4 升级到 eclipse 3.4.1 和 java 1.5。 我的单元测试在 jUnit 3 中。

eclipse java 版本 1.5.0__17

独立环境版本 1.5.0__12 或 1.5.0-17 都可以工作。

我有一个将 XML 文件写入磁盘的类的方法。 它调用 TransformerFactory tf = [javax.xml.transform.]TransformerFactory.newInstance(); 当我在 Eclipse 之外运行代码时,它运行良好。 当我在 Eclipse 中运行 jUnit 中的代码时,我得到下面的堆栈跟踪。 缺少的类在 java 1.4 的 rt.jar 中,而不是在 java 5 中,但不应该从我这里抽象出来吗?

我怎样才能使测试通过?

当我从应用程序运行 eclipse 中的代码时,我得到了同样的错误。

java.lang.NoClassDefFoundError: org/apache/xalan/processor/TransformerFactoryImpl 在 weblogic.xml.jaxp.RegistryTransformerFactory.(RegistryTransformerFactory.java:62) 在 weblogic.xml.jaxp.RegistrySAXTransformerFactory.(RegistrySAXTransformerFactory.java:12) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:494) 在 java.lang.Class.newInstance0(Class.java:350) 在 java.lang.Class.newInstance(Class.java:303) 在 javax.xml.transform.FactoryFinder.newInstance(FactoryFinder.java:100) 在 javax.xml.transform.FactoryFinder.findJarServiceProvider(FactoryFinder.java:278) 在 javax.xml.transform.FactoryFinder.find(FactoryFinder.java:185) 在 javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:103) 在 com.bellsouth.snt.cnmp.sso.netcool.NetcoolAccessThread.writeXmlFile(NetcoolAccessThread.java:278) 在 com.bellsouth.snt.cnmp.sso.netcool.NetcoolAccessThreadTest.testWriteXmlFile(NetcoolAccessThreadTest.java:83) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:585) 在 junit.framework.TestCase.runTest(TestCase.java:164) 在 junit.framework.TestCase.runBare(TestCase.java:130) 在 junit.framework.TestResult$1.protect(TestResult.java:106) 在 junit.framework.TestResult.runProtected(TestResult.java:124) 在 junit.framework.TestResult.run(TestResult.java:109) 在 junit.framework.TestCase.run(TestCase.java:120) 在 junit.framework.TestSuite.runTest(TestSuite.java:230) 在 junit.framework.TestSuite.run(TestSuite.java:225) 在 org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

更新 我在堆栈跟踪的内部做了一些更多的研究。工作版本(在 Eclipse 之外)正在返回一个 com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl 的实例,它是 javax.xml.transform.TransformerFactory.newInstance() 中的后备 impl 类名

公共静态 TransformerFactory newInstance() 抛出 TransformerFactoryConfigurationError 尝试 返回 (TransformerFactory) FactoryFinder.find( /* 根据 JAXP 规范的默认属性名称 */ "javax.xml.transform.TransformerFactory", /* 回退实现类名,XSLTC */ “com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl”); 捕捉(FactoryFinder.ConfigurationError e) 抛出新的 TransformerFactoryConfigurationError( e.getException(), e.getMessage());

【问题讨论】:

【参考方案1】:

我在单元测试的设置中添加了以下行

    System.setProperty("javax.xml.transform.TransformerFactory", "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");

我想出了一点 RTFM 的用途。 http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/transform/TransformerFactory.html#newInstance()

【讨论】:

【参考方案2】:

您可以检查在 Eclipse 中运行时是否使用与在其外部运行时相同的 Java 版本(在 Eclipse 中:运行方式 -> 运行配置... -> JRE 选项卡)。

【讨论】:

相同版本(有时)问题已在上面更新。【参考方案3】:

将 Xalan JAR 添加到类路径中。

如果您使用的是 WebLogic,另请参阅 here。您必须将 JAR 放在 shared/lib 中。

【讨论】:

那为什么它会在 Eclipse 之外运行呢?我还没有将 xalan jar 添加到我的 java 路径中。 要尝试缩小可能的原因,只需添加 Xalan JAR。然后希望你能让它工作,并且在比较不同的运行时环境时你会更好地知道要寻找什么。

以上是关于XML 代码运行正常,但 junit 因 NoClassDefFound 而失败的主要内容,如果未能解决你的问题,请参考以下文章

spring 继承 mybatis时, 可以正常运行 编写的junit报错,原因是mybatis没有加入到mapperFactory中 求解

转载IntelliJ IDEA配置JUnit进行单元测试

如何解析JUnit结果xml文件并在java代码中获取testcase?

单元测试利器 JUnit 4

JUnit 测试通过但 PIT 说套件不是绿色的

KissXML 因包含处理指令的 XML 而失败