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

时间:2009-02-06 19:02:39

标签: java junit eclipse-3.4 xsltc

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

eclipse java version 1.5.0__17

独立env版本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
 at weblogic.xml.jaxp.RegistryTransformerFactory.(RegistryTransformerFactory.java:62)
 at weblogic.xml.jaxp.RegistrySAXTransformerFactory.(RegistrySAXTransformerFactory.java:12)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
 at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
 at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
 at java.lang.reflect.Constructor.newInstance(Constructor.java:494)
 at java.lang.Class.newInstance0(Class.java:350)
 at java.lang.Class.newInstance(Class.java:303)
 at javax.xml.transform.FactoryFinder.newInstance(FactoryFinder.java:100)
 at javax.xml.transform.FactoryFinder.findJarServiceProvider(FactoryFinder.java:278)
 at javax.xml.transform.FactoryFinder.find(FactoryFinder.java:185)
 at javax.xml.transform.TransformerFactory.newInstance(TransformerFactory.java:103)
 at com.bellsouth.snt.cnmp.sso.netcool.NetcoolAccessThread.writeXmlFile(NetcoolAccessThread.java:278)
 at com.bellsouth.snt.cnmp.sso.netcool.NetcoolAccessThreadTest.testWriteXmlFile(NetcoolAccessThreadTest.java:83)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
 at java.lang.reflect.Method.invoke(Method.java:585)
 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:460)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)
 at 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()中的fallback impl类名。 p>

    public static TransformerFactory newInstance()
        throws TransformerFactoryConfigurationError {
        try {
            return (TransformerFactory) FactoryFinder.find(
            /* The default property name according to the JAXP spec */
            "javax.xml.transform.TransformerFactory",
            /* The fallback implementation class name, XSLTC */
            "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl");
        } catch (FactoryFinder.ConfigurationError e) {
            throw new TransformerFactoryConfigurationError(
                e.getException(),
                e.getMessage());
        }
    }

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

我添加了以下一行来设置unittest

    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 :(得分:0)

将Xalan JAR添加到类路径中。

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