Maven,循环导入,用于编译的类路径

时间:2013-05-13 18:17:01

标签: maven maven-3

我的任务是将遗留项目从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?一些解决方法?

欢迎最佳实践。

2 个答案:

答案 0 :(得分:1)

我建议您重构代码以打破循环依赖。根据项目的不同,可以使用不同的策略:

  • FooBar真的需要彼此了解吗?通过删除其中一个依赖项,其中一个类将处于控制之中。它知道它自己的状态,同时它可以询问另一个类的实例的当前状态。
  • 使用dependency injection打破依赖关系(例如,通过引入新的Baz foo包,让Foo依赖Baz,删除依赖关系从foo项目到bar项目,让Bar实施Baz)。
  • observer pattern的介绍可以在不忘记更改的情况下解耦您的课程。

答案 1 :(得分:1)

当您使用Maven时需要注意的一件事是,Maven需要明确定义项目的组件(JAR,WAR或其他类型的模块)。清晰的非循环依赖是先决条件之一。

如果由于循环依赖而遇到问题,您需要了解一些事项: (@matsev的回答提供了很多方法,我正在添加一些)

  1. foobar是否真的适合分成单独的模块,如果它们需要如此紧密耦合?
  2. 如果您认为应将它们放入单独的模块中,那么您需要重构代码。根据您的实际情况,有很多不同的方法可以解决您的问题:
    • 介绍接口,以便Foo和Bar使用相应的接口,您可以将接口放入单独的模块(称为foo-api或bar-api)
    • 双重调度
    • 任何其他模式可帮助您正确设计Foo和Bar,以便在Foo和Bar之间建立清晰的关系。没有人能真正告诉你该怎么做,因为这取决于你的需要。只有一件事是清楚的:设计有改进的地方。它现在给人一种难闻的气味。