当前位置: 首页 > 面试题库 >

Maven循环依赖

宣俊豪
2023-03-14
问题内容

我有一个模块化的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, 因为这两个模块分别属于WAR和JAR(模块“ EJB”被编译为type =“ ejb”并使用maven
ejb插件编译)并使用不同的ClassLoader(它在JBoss 7上运行)。另一方面, InterfaceImpl 无法移动到BIZ,因为它需要
MyEJB1 来完成其工作,这将引入循环依赖性。

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


问题答案:

您应该对这些依赖项进行更多拆分。

这样的事情会更好:

。
├──pom.xml
├──my-api(“ API”)
| ├──pom.xml
| └──src
| └──主要
| └──java
| └──我的
| └──包
| └──MyInterface.java
├──my-ejb(“ EJB”)
| ├──pom.xml
| └──src
| └──主要
| └──java
| └──我的
| └──包
| └──InterfaceImpl.java
└──my-web(“ BIZ”)
    ├──pom.xml
    └──src
        └──主要
            ├──Java
            | └──我的
            | └──包
            | └──ImplFactory.java
            └──webapp
                └──WEB-INF
                    └──web.xml

BIZ取决于EJB取决于API

现在,这将解决您的迫在眉睫的问题,但是我不建议您创建这些工厂,而应该使用CDI,但这是另一回事了。



 类似资料:
  • 我们有一个模块化项目,包含大约10个工件: 此外,一些工件之间存在依赖关系: 我们当前的设置如下所示: parent是包含父POM的工件 这个父POM定义了所有必要的依赖项(比如Spring、JPA等等)进来 我们所有的工件也都在中定义 我们的工件将父工件称为明显的父工件 只有父POM定义版本。其他所有的POM都没有 我们使用三个数字的版本控制方案: 例如: 问题是: 一旦我们更改了工件的版本(例

  • 作为foo-3.0.0.jar的“旧版本圈”使用bar-2.0.0.jar,bar-2.0.0.jar使用foo-1.0.0.jar。 这不是关于构建foo.jar或bar.jar,而是关于构建依赖于foo.jar或bar.jar的项目。

  • 问题内容: 我有两个文件和,分别定义了两个类和。 直到今天,用于引用该对象的定义,因此我已经做了 在文件中。 但是,到目前为止,我已经为引用该对象的对象创建了一个新方法。 尝试导入时遇到了问题:我尝试了一下,当程序运行并调用了using的方法时,出现了一个未定义的异常。 我该怎么办? 问题答案: 导入Python模块 是一篇很棒的文章,介绍了Python中的循环导入。 解决此问题的最简单方法是将路

  • 问题内容: 我目前正在研究Vaadin春季应用程序。根据应用规范,必须通过查询数据库来完成对用户的身份验证/授权。如何解决这个问题?我正在使用Spring Boot 1.4.2.RELEASE。 更新 :此方法适用于Spring Boot 1.1.x.RELEASE,但是在最新版本中会产生以下错误消息。 原始代码如下所示: 帐户存储库: JdbcAccountRepository: JdbcUse

  • 问题内容: 我已经搜索了很多,但是我发现的主要是python中的递归编程示例。因此,问题来了: 我该如何实现? 问题答案: 一切在Python中都是动态的-甚至是类声明。在初始声明之后,没有什么可以阻止您修改类的内容的: 注意:如果您不太熟悉Python,则该关键字仅允许您说“这里什么都没有”-除非A类的空值与本例中的一样空,否则它并不重要!

  • 问题内容: 我有以下课程。 和 可以清楚地看到,这些类之间存在循环依赖关系。如果尝试运行A类,最终会得到。 如果创建了一个依赖图,其中节点是类,则可以轻松地识别这种依赖关系(至少对于节点很少的图)。那么,为什么JVM至少在运行时无法识别此身份?JVM至少可以在开始执行之前发出警告,而不是抛出。 [更新] 某些语言不能具有循环依赖关系,因为这样就无法构建源代码。和可接受的答案。如果循环依赖性是C#的