3

エキゾチックな変更やサーバーのチューニングなしで正常にデプロイできる .war アプリケーション モジュールがあります。ただし、このアプリを GF 3.1.2 にデプロイできませんでした: サーバーは次の例外をスローします:

java.lang.Exception: java.lang.IllegalStateException: ContainerBase.addChild: 開始: org.apache.catalina.LifecycleException: org.apache.catalina.LifecycleException: java.lang.NoSuchFieldError: theInstance

私は何を間違っていますか?誰かが私に何か提案しましたか?.war モジュールを正常にデプロイするために実行する必要がある追加の設定はありますか?

よろしくお願いします。

UPD

より正確なログ エントリ:

javax.xml.bind.JAXBException: プロバイダー com.sun.xml.bind.ContextFactory_1_0_1 をインスタンス化できませんでした: javax.xml.bind.JAXBException - リンクされた例外: [java.lang.NoSuchFieldError: theInstance]
- リンクされた例外: [ javax.xml.bind.JAXBException - リンクされた例外あり: [java.lang.NoSuchFieldError: theInstance]]

4

4 に答える 4

3

クラスローダーの問題のように聞こえます。

GlassFish JAXB jar の前に使用する WEB-INF/lib JAXB jar が必要です。または、GlassFish 3.1.2 がバンドルされているバージョンを使用するようにアプリを変更します。

サーブレットの仕様では、Web アプリケーションは親に委譲する前にローカル クラス ローダーを使用する必要があると規定されています。デフォルトでは、GlassFish は Web アプリケーションの親クラス ローダーに委譲していると思います。<class-loader delegate="false"/>web.xml または glassfish-web.xml で使用します。

これがうまくいかない場合、GlassFish のクラスローダーを変更する他の方法があるかもしれないことに注意してください。

このタイプの問題は、多くのアプリケーション サーバーへの展開中によ​​く見られます。私は過去 5 年以上にわたって GlassFish を毎日使用しており、これを頻繁に目にします。最近、CloudBees 上の JBoss にデプロイするときに同様の問題が発生し、それに応じてデプロイメント記述子を変更しました。

「グラスフィッシュはweb-inf/lib jarを好む」とグーグル。

応答 以下の psed コメントへの対応 EJB インターフェースは、Web モジュールと EJB モジュールが共有するクラスパス階層に存在する必要があります。WEB-INF/lib に EJB インターフェース jar があり、EJB モジュール クラスパスに EJB インターフェース jar の別のコピーがある場合、Web アプリケーションに EJB を注入/検索するときに ClassCastException が発生します。WebServices にも同じ問題があると思います。ただし、EAR を介して EJB インターフェイス jar を共有すると、この問題は解決するはずです。私が気付いていない他の問題があるかもしれないことに注意してください

于 2012-12-30T02:10:01.653 に答える
1

JAXB jar をアプリケーションにバンドルするべきではありません - Glassfish には既に JAXB jar があり、これが競合を引き起こしているようです (ちなみに、私は最近 JAXB コードを掘り下げていて、theInstanceによって定義された静的クラスの一部ですMarshallerImpl) 。

于 2012-12-24T12:11:23.817 に答える
0

この手順は GlassFish 3.1.2 用です。問題は、JAXB 2.2.5 のランタイム クラスが JAXB 1 コードで後方コンパイルできないことです。この問題は JAXB 2.2.6 で修正されましたが、最新の GlassFish リリースには含まれていません。そのため、GlassFish の次のアップグレードまで待つか、手動で行います。

これが私が行った方法です。GlassFishモジュールから2つのバンドルファイルを削除しました

C:\glassfish3\glassfish\modules\jaxb-osgi.jar
C:\glassfish3\glassfish\modules\endorsed\jaxb-api-osgi.jar

のすべてのサブフォルダーを削除して、osgi-cache をクリアします。

C:\glassfish3\glassfish\domains\domain1\osgi-cache

ORACLE JAXBから JAXB 2.2.6 をダウンロードします。

zip ファイルを一時的な場所 [C:\Java\jaxb-ri-2.2.6\jaxb-ri-2.2.6\osgi] に解凍します。

C:\Java\jaxb-ri-2.2.6\jaxb-ri-2.2.6\osgi\jaxb-osgi.jar を C:\glassfish3\glassfish\modules\ にコピーします

C:\Java\jaxb-ri-2.2.6\jaxb-ri-2.2.6\osgi\jaxb-api-osgi.jar を C:\glassfish3\glassfish\modules\endorsed\ にコピーします

サーバーを再起動します...これが役立つことを願っています。幸運を

于 2013-03-26T16:54:10.883 に答える
0

すべてのjarファイルをランタイムサーバーライブラリに配置する必要があります...

于 2012-12-29T14:47:48.183 に答える