代码之家  ›  专栏  ›  技术社区  ›  Aaron

XML代码运行正常,但JUnit失败,NoClassDeffound

  •  0
  • Aaron  · 技术社区  · 16 年前

    我正在从Eclipse 3.3.1和Java 1.4升级到Eclipse 3.4.1和Java 1.5。 我的单元测试在6月3日。

    Eclipse Java版本1.5.0y17

    独立env版本1.5.0_uu12或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.transformerfactory impl的实例,这是javax.xml.transform.transformerfactory.newinstance()中的回退impl类名。

        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 回复  |  直到 11 年前
        1
  •  1
  •   Fabian Steeg    16 年前

    您可以在运行Eclipse时运行同一个Java版本,如在运行时运行(在Eclipse中运行:AS & & t;运行配置……)。- JRE tab。

        2
  •  1
  •   Aaron    16 年前

    我在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()

        3
  •  0
  •   eljenso    16 年前

    将xalan jar添加到类路径。

    也看到 here 如果您正在使用WebLogic。您必须将jar放在shared/lib中。

    推荐文章