يعمل رمز XML بشكل صحيح ، لكن Junit فشل مع NoclassDeffound
-
22-08-2019 - |
سؤال
أقوم بترقية بيئتي من Eclipse 3.3.1 و Java 1.4 إلى Eclipse 3.4.1 و Java 1.5. اختبارات وحدتي في Junit 3.
Eclipse Java الإصدار 1.5.0__17
Stand Asse Env الإصدار 1.5.0__12 ، أو 1.5.0-17 ، كلا العمل.
لدي طريقة في الفصل الذي يكتب ملف XML إلى القرص. يستدعي transformerfactory tf = [javax.xml.transform.] transformerfactory.newinstance () ؛ عندما أقوم بتشغيل الكود خارج Eclipse ، فإنه يعمل بشكل جيد. عندما أقوم بتشغيل الرمز في Junit في Eclipse ، أحصل على تتبع المكدس أدناه. الطبقة المفقودة في RT.JAR من Java 1.4 وليس في 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 ()
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()); } }
المحلول 2
أضفت السطر التالي لإعداد 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()
نصائح أخرى
يمكنك التحقق مما إذا كنت تعمل مع إصدار Java نفسه عند التشغيل في Eclipse كما هو الحال عند التشغيل خارجها (في Eclipse: Run As -> تشغيل التكوين ... -> JRE Tab).
أضف جرة xalan إلى classpath.
انظر أيضا هنا إذا كنت تستخدم WebLogic. سيكون عليك وضع الجرة في مشترك/lib.