我的任务是将遗留项目从ant迁移到maven,并且遇到循环导入问题。我的问题是ant构建了许多包含相同类的jar。
最初的ant项目有一个src文件夹,包含那里的所有包。对于maven兼容性,我需要使用pom.xml将src文件夹拆分为多个模块(如指南和手册中所述)。
快速举例。
Foo.java
package myapp;
import my.domain.myapp.Bar;
...
Bar.java
import my.domain.myapp.Foo;
...
src/my/domain/myapp/foo/foo.java (foo.jar)
src/my/domain/myapp/bar/bar.java (bar.jar)
有2个软件包放在同一个父包中,没有编译问题。 Ant项目只是编译java类,然后按模式生成工件。所以,编译* .class只是复制到jar。对于maven,我没有看到相同的方式,我想我需要拆分包如:
pom.xml (parent)
--foo
----src/main/java/my/domain/myapp/foo/foo.java
----pom.xml
--bar
----src/main/java/my/domain/myapp/bar/bar.java
----pom.xml
所以,在maven我只知道set依赖jar作为另一个jar。在我的情况下,我有循环导入锁定构建。我不能在没有bar.jar的情况下构建foo.jar,反之亦然。
Maven有什么要为编译过程指定类路径变量而不是将依赖项设置为jar?一些解决方法?
欢迎最佳实践。
答案 0 :(得分:1)
我建议您重构代码以打破循环依赖。根据项目的不同,可以使用不同的策略:
Foo
和Bar
真的需要彼此了解吗?通过删除其中一个依赖项,其中一个类将处于控制之中。它知道它自己的状态,同时它可以询问另一个类的实例的当前状态。Baz
foo
包,让Foo
依赖Baz
,删除依赖关系从foo
项目到bar
项目,让Bar
实施Baz
)。答案 1 :(得分:1)
当您使用Maven时需要注意的一件事是,Maven需要明确定义项目的组件(JAR,WAR或其他类型的模块)。清晰的非循环依赖是先决条件之一。
如果由于循环依赖而遇到问题,您需要了解一些事项: (@matsev的回答提供了很多方法,我正在添加一些)
foo
和bar
是否真的适合分成单独的模块,如果它们需要如此紧密耦合?