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,但这是一个不同的故事。

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

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

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

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