3

このガイドに従って、EAR からインターフェイスとエンティティを「抽出」して別の Web アプリケーションから使用するのに問題があります。

  • NetBeans 6.8 と Glassfish 3.0.1 を使用しています
  • 「Java クラス ライブラリ」プロジェクト
    • すべてのエンティティとインターフェースが含まれています
  • 「Java EE アプリケーション」プロジェクト
    • プロジェクトに追加されたクラス ライブラリは、EAR にパッケージ化されます
    • EJB 実装、MDB、テストを含む
  • 「Java Web アプリケーション」プロジェクト
    • プロジェクトに追加されたクラス ライブラリは、WAR にパッケージ化されます。
    • REST インターフェイスを含む

Web アプリケーションをビルドしてデプロイすると、すべてがうまくいきます。

Java EE アプリケーションをビルドすると、jar ファイル (インターフェース、エンティティー) が含まれていることがわかります。しかし、EAR をデプロイしようとすると、Glassfish は java.lang.NoClassDefFoundError エラーでそれを拒否します。

[#|2010-03-28T18:25:59.875+0200|WARNING|glassfishv3.0|javax.enterprise.system.tools.deployment.org.glassfish.deployment.common|_ThreadID=28;_ThreadName=Thread-1;|Error in annotation processing: java.lang.NoClassDefFoundError: mvs/core/StoreServiceLocal|#]

[#|2010-03-28T18:25:59.876+0200|SEVERE|glassfishv3.0|javax.enterprise.system.core.com.sun.enterprise.v3.server|_ThreadID=28;_ThreadName=Thread-1;|Exception while deploying the app
java.lang.IllegalArgumentException: Invalid ejb jar [CoreServer]: it contains zero ejb. 
Note: 
1. A valid ejb jar requires at least one session, entity (1.x/2.x style), or message-driven bean. 
2. EJB3+ entity beans (@Entity) are POJOs and please package them as library jar. 
3. If the jar file contains valid EJBs which are annotated with EJB component level annotations (@Stateless, @Stateful, @MessageDriven, @Singleton), please check server.log to see whether the annotations were processed properly.

「mvs/core/StoreServiceLocal」は、ライブラリ jar ファイルで定義されているインターフェイスです。

私は何を間違っていますか?

私は EJB3 アノテーションを使用しているため、Bean 固有のデプロイメント記述子はありません。

mvs/core/ShopperService.java:

@Stateless
public class ShopperService implements ShopperServiceLocal, ShopperServiceRemote {
}

mvs/core/ShopperServiceLocal.java:

@Local
public interface ShopperServiceLocal {
}
4

2 に答える 2

4

「Java EE アプリケーション」プロジェクトには、インターフェースが含まれている必要があります (現在、実行時にロードできないため、NoClassDefFoundError)。また、別の Web アプリケーションから EJB を呼び出す場合は、追加の「クライアント」jar を作成します (インターフェースのみ)。

于 2010-03-29T09:51:28.617 に答える
1

上記の EAR ファイルの詳細な構造についてはわかりません。EAR ファイルの「内部」は、1 つの WAR ファイル (Web コンテナー用) と、EJB を含む別の JAR ファイル (EJB コンテナー用) である必要があります。適切なコンテナーには別個のクラス・ローダーがあるため、両者は EJB インターフェースについて認識している必要があります。

完全な EJB 機能が必要ない場合は、EJB lite (EJB 3.1 に付属) を使用すると、両方を入れることができる 1 つの WAR ファイルを作成するだけで済みます。この WAR には、たとえば EJB とサーブレットを含めることができます。これにより、WAR ファイルが 1 つだけで簡単に展開できます。ただし、EJB lite は、EJB がリモート インターフェースを提供する必要がない場合にのみ役立ちます。

EJB のリモート インターフェースが必要な場合は、EAR ファイルが最適です。この EAR ファイルには、Web 用の WAR ファイルと、EJB 定義用の JAR ファイルが含まれている必要があります。

于 2010-03-29T12:42:12.610 に答える