3

我有一个模块化的 maven 项目,其中两个模块“BIZ”和“EJB”包含如下内容:

//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”依赖于“BIZ”,因为它使用MyClassX(实际上,它使用了几个 BIZ 类)。这就是ImplFactory使用反射来实例化InterfaceImpl的原因。问题是cl.newInstance()将抛出ClassCastException因为 2 个模块分别属于 WAR 和 JAR(模块“EJB”被编译指定 type="ejb" 并使用 maven ejb 插件)并使用不同的 ClassLoader(它在 JBoss 7 上运行)。另一方面,InterfaceImpl不能移动到 BIZ,因为它需要MyEJB1来完成它的工作,这会引入循环依赖。

所以我的问题是:您将如何解决这个棘手的情况(以编程方式或通过更改配置)?我希望你能帮帮我!谢谢!

4

2 回答 2

3

您应该多拆分这些依赖项。

像这样的东西会更好:

.
├── pom.xml
├── my-api ("API")
| ├── pom.xml
| └── 源
| └── 主要
| └── java
| └── 我的
| └── 包装
| └── MyInterface.java
├── my-ejb ("EJB")
| ├── pom.xml
| └── 源
| └── 主要
| └── java
| └── 我的
| └── 包装
| └── InterfaceImpl.java
└── 我的网络(“BIZ”)
    ├── pom.xml
    └── 源
        └── 主要
            ├── java
            | └── 我的
            | └── 包装
            | └── ImplFactory.java
            └── 网页应用
                └── WEB-INF
                    └── web.xml

BIZ将取决于EJB取决于API

现在这将解决您眼前的问题,但我不建议您创建这些工厂,您应该改用CDI,但那是另一回事了。

于 2012-11-13T06:53:02.697 回答
0

我不确定这是否有帮助,只是分享一些我用过的东西。

  1. 对于循环依赖,当我的 war 文件中有一个 src 模块时我做的一件事。引用模块可以通过添加 maven dep 来从战争中取出 jar:(现在不确定确切的语法) <dependancy> <groupid ../> <artifactid .war module name./> <jarModuleName> </dependancy>

  2. 在一种情况下,由于自冗余,我无法调用 war 模块的 src。然后我必须制作一个单独的 src 模块并将其作为依赖项添加到所有需要它的 war 模块中。

我不确定这是否可以帮助您。只是想分享我所知道的。让我知道您是否可以改进我的评论。

于 2012-11-12T17:21:51.750 回答