如何解决maven循环问题?

Cri*_*riu 0 java maven-2 maven

我有这种依赖情况:

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

其中B-> C表示模块C在其pom.xml中与B有依赖关系.

好吧......我想在C中使用B中的一个类,所以我必须把C-> B但是我收到一个循环错误,你可以看到上面...

你看到任何解决方法吗?我不能在C中用B移动那个类,因为它已经使用了A中的一些类,并且会再次循环.

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

IAlfa alfa = new Alfa() 
Run Code Online (Sandbox Code Playgroud)

所以我需要从B导入Alfa.

你怎么看?

谢谢.

Sea*_*oyd 5

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

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)
Run Code Online (Sandbox Code Playgroud)

假设我们Personapi模块中有一个接口.现在在impl模块中,你有一个类JpaPerson,因为impl使用JPA.但是,那些是客户端和服务器现在不需要的细节,因此您不应该(并且在我的设计中不能)new JpaPerson()在其中client或者中执行server.相反,你会有一个界面(也在内部api)被调用PersonFactory(当你谈论人时听起来很糟糕,或者说它更人性化),它有这样的方法:

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
    );

}
Run Code Online (Sandbox Code Playgroud)

同样,在impl模块中实现此接口,但仅将其作为接口引用到其他模块中.然后使用依赖注入将事物连接在一起(Spring,SEAM,EJB3,等等).

您提到的情况是代码执行超出其职责范围的结果(阅读关注点分离).

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


编辑:

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