0

我的任务是将遗留项目从 ant 迁移到 maven,并且在循环导入时遇到问题。我的问题是 ant 构建了许多包含相同类的罐子。

最初的 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 中,我只知道将依赖项设置为 jar 到另一个 jar。就我而言,我已经循环导入锁定构建。如果没有 bar.jar,我就无法构建 foo.jar,反之亦然。

Maven有一些东西可以为编译过程指定类路径变量而不是将依赖项设置为jar?一些解决方法?

欢迎使用最佳实践。

4

2 回答 2

1

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

如果您因为循环依赖而遇到问题,那么您需要研究一下:(@matsev 的答案提供了很多方法,我正在添加一些方法)

  1. 如果它们需要如此紧密地耦合,是否真的适合拆分成单独的foo模块?bar
  2. 如果您认为应该将它们放入单独的模块中,那么您需要重构您的代码。有很多不同的方法可以解决您的问题,具体取决于您的实际情况:
    • 引入接口,让Foo和Bar使用对应的接口,可以把接口放到单独的模块中(叫foo-api或者bar-api)
    • 双重调度
    • 任何其他有助于您正确设计 Foo 和 Bar 的模式,以明确 Foo 和 Bar 之间的关系。没有人能真正告诉你该怎么做,因为这取决于你的需要。只有一件事是明确的:设计有改进的地方。它现在发出很大的难闻气味。
于 2013-05-14T01:43:44.317 回答
1

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

  • Foo两者是否Bar真的需要相互了解?通过删除其中一个依赖项,其中一个类将处于控制之中。它知道自己的状态,同时它可以询问另一个类的实例的当前状态。
  • 使用依赖注入来打破依赖(例如,通过引入一个新Bazfoo包,让Foo依赖Baz,从foo项目中删除对项目的依赖bar,并让Bar实现Baz)。
  • 观察者模式的引入可以在不丢失更改跟踪的情况下解耦您的类。
于 2013-05-13T20:31:59.770 回答