maven循环依赖

时间:2012-11-12 16:12:15

标签: java java-ee maven jboss

我有一个模块化的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 ,这会引入循环依赖。

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

2 个答案:

答案 0 :(得分:3)

您应该将这些依赖项分开一点。

这样的事情会更好:

.
├── pom.xml
├── my-api ("API")
|   ├── pom.xml
|   └── src
|       └── main
|           └── java
|               └── my
|                   └── package
|                       └── MyInterface.java
├── my-ejb ("EJB")
|   ├── pom.xml
|   └── src
|       └── main
|           └── java
|               └── my
|                   └── package
|                       └── InterfaceImpl.java
└── my-web ("BIZ")
    ├── pom.xml
    └── src
        └── main
            ├── java
            |   └── my
            |       └── package
            |           └── ImplFactory.java
            └── webapp
                └── WEB-INF
                    └── web.xml

BIZ取决于取决于EJB的{​​{1}}。

现在这将解决您当前的问题,但我不建议您创建这些工厂,您应该使用CDI代替,但这是另一回事。

答案 1 :(得分:0)

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

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

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

  3. 我不确定这是否可以帮到你。只是想分享我所知道的。如果您能改进我的意见,请告诉我。