3

モジュール式のMavenプロジェクトがあり、「BIZ」と「EJB」の2つのモジュールに次のようなものが含まれています。

//PART OF "BIZ" Module:

public interface MyInterface{

 public void foo();

}
............................................
public class ImplFactory{

public static MyInterface getInterfaceImplementation(){
MyInterface ret=null;
Class<? extends MyInterface> cl = null;
                try {
                    cl= (Class<? extends MyInterface>) Class.forName("InterfaceImpl");
                    ret= cl.newInstance();
                    }
                ....
                ret ret;
}
.......................................
public class MyClassX{

    public static void doSomethingX(){

    }
}

//PART OF "EJB" Module:

public class InterfaceImpl implements MyInterface
@EJB
private MyEJB1 ejb1;

public void  foo(){
    ejb1.doSomething();
}
........................................
@Stateless
public class MyEJB1{

    public void doSomething(){
    ...
    MyClassX.doSomethingX();
    ....
    }

}

ご覧のとおり、 「EJB」はMyClassXを使用するため「BIZ」に依存しています(実際には、いくつかのクラスのBIZを使用しています)。これが、 ImplFactoryがリフレクションを使用してInterfaceImplをインスタンス化する理由です。問題は、cl.newInstance()がClassCastExceptionをスローすることです。これは、2つのモジュールがそれぞれWARとJARに属し(モジュール「EJB」はtype = "ejb"を指定し、maven ejbプラグインを使用してコンパイルされます)、異なるClassLoaderを使用するためです( JBossで実行されます7)。一方、InterfaceImplはそのジョブにMyEJB1が必要であるため、BIZに移動できません。これにより、循環依存が発生します。

だから私の質問は:このトリッキーな状況をどのように解決しますか(プログラムで、または構成を変更することによって)?あなたが私を助けてくれることを願っています!ありがとう!

4

2 に答える 2

3

これらの依存関係をもう少し分割する必要があります。

このようなものの方が良いでしょう:

。
├──pom.xml
├──my-api( "API")
| ├──pom.xml
| └──src
| └──メイン
| └──java
| └──私の
| └──パッケージ
| └──MyInterface.java
├──my-ejb( "EJB")
| ├──pom.xml
| └──src
| └──メイン
| └──java
| └──私の
| └──パッケージ
| └──InterfaceImpl.java
└──my-web( "BIZ")
    ├──pom.xml
    └──src
        └──メイン
            ├──java
            | └──私の
            | └──パッケージ
            | └──ImplFactory.java
            └──webapp
                └──WEB-INF
                    └──web.xml

BIZに依存EJBAPIます。

これで当面の問題は解決しますが、これらのファクトリを作成することはお勧めしません。代わりにCDIを使用する必要がありますが、それは別の話です。

于 2012-11-13T06:53:02.697 に答える
0

これが役立つかどうかはわかりませんが、私が使用したいくつかのことを共有するだけです。

  1. 循環依存の場合、warファイルにsrcモジュールが含まれているときに行ったことの1つです。参照するモジュールは、maven depを次のように追加することで、戦争からjarファイルを取得できます(正確な構文については、現時点ではわかりません)。 <dependancy> <groupid ../> <artifactid .war module name./> <jarModuleName> </dependancy>

  2. あるケースでは、自己冗長性のためにwarモジュールのsrcを呼び出すことができませんでした。次に、別のsrcモジュールを作成し、それを必要なすべてのwarモジュールへの依存関係として追加する必要がありました。

これがあなたを助けることができるかどうかはわかりません。私が知っていることを共有したかっただけです。私のコメントを改善できるかどうか教えてください。

于 2012-11-12T17:21:51.750 に答える