maven循环依赖
我有一个模块化的maven项目,其中两个模块“BIZ”和“EJB”包含这样的东西:
//PART OF "BIZ" Module: public interface MyInterface{ public void foo(); } ............................................ public class ImplFactory{ public static MyInterface getInterfaceImplementation(){ MyInterface ret=null; Class cl = null; try { cl= (Class) 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使用reflection来实例化InterfaceImpl的原因。 问题是cl.newInstance()将抛出一个ClassCastException,因为2个模块分别属于WAR和JAR(模块“EJB”编译指定type =“ejb”并使用maven ejb插件)并使用不同的ClassLoaders(它在JBoss上运行7)。 另一方面, InterfaceImpl无法移动到BIZ,因为它需要MyEJB1作为其工作,这将引入循环依赖。
所以我的问题是:你如何解决这个棘手的情况(以编程方式或通过更改配置)? 我希望你能帮帮我! 谢谢!
您应该将这些依赖项分开一点。
这样的事情会更好:
。 ├──pom.xml ├──my-api(“API”) | ├──pom.xml | └──src | └──主要 | └──java | └──我的 | └──包装 | └──MyInterface.java ├──my-ejb(“EJB”) | ├──pom.xml | └──src | └──主要 | └──java | └──我的 | └──包装 | └──InfaceImpl.java └──我的网(“BIZ”) ├──pom.xml └──src └──主要 ├──java | └──我的 | └──包装 | └──ImplFactory.java └──webapp └──WEB-INF └──web.xml
BIZ
将依赖于依赖于API
EJB
。
现在这将解决您的直接问题,但我不建议您创建这些工厂,您应该使用CDI,但这是一个不同的故事。
我不确定这是否有用,只是分享一些我用过的东西。
-
对于循环依赖,当我的war文件中有一个src模块时,我做了一件事。 引用模块可以通过添加maven dep来从战争中获取jar :(现在不确定确切的语法)
-
在一种情况下,由于自冗余,我无法调用war模块的src。 然后我必须创建一个单独的src模块,并将其作为依赖项添加到所需的所有war模块。
我不确定这是否可以帮到你。 只是想分享我所知道的。 如果你能改进我的评论,请告诉我。