gpt4 book ai didi

java - 如何解决maven循环问题?

转载 作者:行者123 更新时间:2023-12-01 07:15:43 25 4
gpt4 key购买 nike

我有这种依赖情况:

C (->) B -> A -> C

其中 B->C 表示模块 C 在其 pom.xml 中依赖于 B。

嗯...我想在 C 中使用 B 中的类,所以我必须将 C->B 但我收到一个循环错误,如您在上面看到的...

您看到任何解决方法吗?我无法将该类从 B 移到 C 中,因为它已经使用了 A 中的一些类,并且将再次循环。

我尝试在 C 中声明一个接口(interface) IAlfa 并在 B(Alfa) 中实现它(但是当我想使用它时,我需要实例化,如下所示:

IAlfa alfa = new Alfa() 

所以我再次需要从 B 导入 Alfa。

你觉得怎么样?

谢谢。

最佳答案

这不应该发生。我通常做的是这样的模块结构:

root
- api (interfaces, enums and custom exceptions only)
- impl (standard implementation of api -> dependency to api)
- server (runtime dependency to impl, compile time to api only)
- client (dependency to api only)

假设我们在 api 模块中有一个接口(interface) Person。现在,在 impl 模块中,您将有一个类 JpaPerson,因为 impl 使用 JPA。但是,这些是客户端和服务器现在不需要的详细信息,因此您不应该(并且在我的设计中不能)在 client 中执行 new JpaPerson()服务器。相反,您将有一个名为 PersonFactory 的接口(interface)(也在 api 内部)(当您谈论人时听起来很糟糕,也许将其命名为更人性化),它具有像这样的方法:

public interface PersonFactory{

Person findPersonBySsn(String socialSecurityNumber);
List<Person> findPersonsByName(String firstName, String lastName);
List<Person> findPersonByBirthDate(Date birthDate);
Person createPerson(
String firstName, String lastName,
Date birthDate, String socialSecurityNumber
);

}

同样,在 impl 模块中实现此接口(interface),但仅在其他模块中将其作为接口(interface)引用。然后使用dependency injection将事物连接在一起(Spring、SEAM、EJB3,等等)。

您提到的情况是代码执行超出其职责范围的操作的结果(请阅读 separation of concerns )。

这种设计的巨大优势在于,您可以单独重构所有模块(api 除外),而无需更改其他模块中的代码。所以如果你想从jpa切换到经典hibernate,你只需要编辑impl。如果你想将服务器从axis切换到cxf,只需更改server即可。这让事情变得容易多了。当然,您不会获得循环依赖。

<小时/>

编辑:

一个简单(更简单)的解决方案是引入一个模块 d,它作为依赖项包含在 a、b 和 c 中。将所有通用代码移至 d。 (实际上将这个 d 重命名为 a,将 a,b,c 重命名为 b,c,d)。

关于java - 如何解决maven循环问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3353463/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com