我有一个模块化的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 ,这会引入循环依赖。
所以我的问题是:你如何解决这个棘手的情况(以编程方式或通过更改配置)? 我希望你能帮帮我!谢谢!
答案 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)
我不确定这是否有用,只是分享一些我用过的东西。
对于循环依赖,当我的war文件中有一个src模块时,我做了一件事。引用模块可以通过添加maven dep来从战争中获取jar :(现在不确定确切的语法)
<dependancy> <groupid ../> <artifactid .war module name./> <jarModuleName> </dependancy>
在一种情况下,由于自我冗余,我无法调用war模块的src。然后我必须创建一个单独的src模块,并将其作为依赖项添加到所需的所有war模块。
我不确定这是否可以帮到你。只是想分享我所知道的。如果您能改进我的意见,请告诉我。