4

私はこの質問をしているのは、自分で答えられるようにするためです。なぜなら、それは2日間私を狂わせ、他の誰も私のように苦しむ必要がないからです。

耳を配置すると、次のような例外が発生します。


Exception while invoking class org.glassfish.appclient.server.core.AppClientServerApplication start method
org.jvnet.hk2.component.ComponentException: injection failed on org.glassfish.appclient.server.core.jws.JavaWebStartInfo.dch with class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
    at org.jvnet.hk2.component.InjectionManager.error_injectionException(InjectionManager.java:284)
    at org.jvnet.hk2.component.InjectionManager.inject(InjectionManager.java:161)
    at org.jvnet.hk2.component.InjectionManager.inject(InjectionManager.java:93)
.
.
Caused by: org.jvnet.hk2.component.ComponentException: Failed to create class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
.
.
Caused by: java.lang.AbstractMethodError: javax.xml.parsers.DocumentBuilderFactory.setFeature(Ljava/lang/String;Z)V
.
.

または時々このように:


Exception while loading the app : injection failed on org.glassfish.appclient.server.core.jws.JavaWebStartInfo.dch with class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
org.jvnet.hk2.component.ComponentException: Failed to create class org.glassfish.appclient.server.core.jws.DeveloperContentHandler
    at com.sun.hk2.component.ConstructorCreator.create(ConstructorCreator.java:71)
    at com.sun.hk2.component.AbstractCreatorImpl.get(AbstractCreatorImpl.java:80)
.
.
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.glassfish.appclient.server.core.jws.DeveloperContentHandler

あるマシンで完全に機能するearファイルが別のマシンに展開できない可能性があり、サーバーが問題に「感染」しているように見え、以前は完全に機能していたearの展開を拒否する可能性があるため、バグは非常に厄介です。キャッシュと生成されたファイルをクリアしても、それがなくなるわけではありません。

4

2 に答える 2

3

何時間もそれをいじった後、私は答えがあると思います-問題は、earlibフォルダーにxerxes-impljarファイルが含まれていることが原因です。いくつかのクラスの読み込みの奇妙さによって、サーバー自体のxmlパーサーが置き換えられているのではないかと思います。サーバーが再起動されるまでクラスパスの問題が解消されないため、これは奇妙な感染の問題の原因となります。問題がどのxmlパーサーでも現れる可能性がありますが、私はチェックしていません。

Glassfishをシャットダウンする問題を解決するには、デプロイするearにxercesが含まれていないことを確認してから、glassfishを再起動し、新しいクリーンなearファイルをデプロイします。動作するはずです。それは私のためになりました。それができない場合、あなたの唯一の頼みは血の犠牲になると思います。

于 2012-05-12T18:08:24.977 に答える
1

JDKは、javax.xml.parsers.DocumentBuilderFactoryインターフェースを定義し、デフォルトの実装を提供します。サービスプロバイダーは、システムプロパティ「javax.xml.parsers.DocumentBuilderFactory」を設定することで実装クラスを置き換えることができます。xercesをデプロイすると、このプロパティを使用して独自の実装が提供されました。

javax.xml.parsers.DocumentBuilderFactoryからのスニペット:

   public static DocumentBuilderFactory newInstance() {
    try {
        return (DocumentBuilderFactory) FactoryFinder.find(
            /* The default property name according to the JAXP spec */
            "javax.xml.parsers.DocumentBuilderFactory",
            /* The fallback implementation class name */
            "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
    } catch (FactoryFinder.ConfigurationError e) {
        throw new FactoryConfigurationError(e.getException(),
                                            e.getMessage());
    }

}

これはすべて、 javax.xml.parsers.SAXParserFactoryにも当てはまります。

パーサー実装の選択

他のファクトリクラスが指定されていない場合は、デフォルトのSAXParserFactoryクラスが使用されます。別のメーカーのパーサーを使用するには、それを指す環境変数の値を変更できます。これは、コマンドラインから実行できます。

java -Djavax.xml.parsers.SAXParserFactory = yourFactoryHere [...]

指定するファクトリ名は、完全修飾クラス名である必要があります(すべてのパッケージプレフィックス>が含まれます)。詳細については、> SAXParserFactoryクラスのnewInstance()メソッドのドキュメントを参照してください。

http://docs.oracle.com/javase/tutorial/jaxp/sax/validation.html

于 2012-12-08T20:22:38.740 に答える