0

環境を 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(ネイティブメソッド)
 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(ネイティブメソッド)
 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 以外) は、javax.xml.transform.TransformerFactory.newInstance() のフォールバック impl クラス名である com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl のインスタンスを返しています。

    public static TransformerFactory newInstance()
        TransformerFactoryConfigurationError をスローします {
        試す {
            return (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());
        }
    }
4

3 に答える 3

2

ユニットテストのセットアップに次の行を追加しました

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

于 2009-02-09T19:00:25.793 に答える
1

Eclipse で実行する場合と、Eclipse の外で実行する場合とで同じ Java バージョンで実行しているかどうかを確認できます (Eclipse では、[Run As] -> [Run Configuration]... -> [JRE] タブ)。

于 2009-02-06T19:11:41.267 に答える
0

Xalan JAR をクラスパスに追加します。

WebLogic を使用している場合は、こちらも参照してください。JAR を shared/lib に配置する必要があります。

于 2009-02-06T19:05:43.023 に答える