我有一个模块化的 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来完成它的工作,这会引入循环依赖。
所以我的问题是:您将如何解决这个棘手的情况(以编程方式或通过更改配置)?我希望你能帮帮我!谢谢!