有一个多模块Maven-3项目,其中一个子模块在所有其他模块中用作<dependency>
。同时,所有子模块都从父模块继承。这种结构导致循环依赖性。我该如何解决?
项目结构相当典型:
/foo
/foo-testkit
/foo-core
这是父foo/pom.xml
:
[...]
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<configLocation>checkstyle/checks.xml</configLocation>
</configuration>
<dependencies>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>foo-testkit</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<executions>
<execution>
<phase>prepare-package</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
[...]
在父foo/pom.xml
中,我指定了必须在每个子模块中执行checkstyle插件的方式和时间。但我不需要在foo-testkit
中执行checkstyle,这是一个继承自foo
的子模块,但同时也是一个依赖项。
答案 0 :(得分:4)
一种方法是通过将以下内容添加到foo-testkit的pom.xml文件来禁用模块foo-testkit的checkstyle插件。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<configuration>
<skip>true</skip>
</configuration>
</plugin>
如果这不符合您的喜好,另一种方法是将checkstyle插件配置从build / plugins移动到父pom.xml文件中的build / pluginManagment / plugins。然后在每个模块中执行checkstyle,将其添加到每个模块的pom.xml文件的build / plugins部分:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
这将调用该模块的插件,并将应用pluginManagement部分下的父pom.xml中指定的配置。您可以通过在该模块上运行mvn help:effective-pom
来验证其是否正常工作。
答案 1 :(得分:2)
我同意Tim Clemons's answer,但也有另一种选择,让您的项目嵌套。
root
/ \
common sub-root
/ | \
sub1 sub2 sub3
在common
pom中定义sub-root
的依赖关系。我不是说这是一种最佳做法,但它可以解决您的问题。
答案 2 :(得分:1)
所以我认为父pom引用其中一个子模块作为依赖项?我建议如果你在父模块中有任何构建逻辑,你将它推入一个新的子模块。父级应限制为指定<modules>
,<pluginManagement>
和<dependencyManagement>
部分。所有其他工作都应该用于子模块。
有关组织多模块项目的更多建议,请参阅以下内容:
http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html
答案 3 :(得分:0)
如果你实际上并不需要它在foo中(仅在其子模块中),你可以通过将插件定义从构建段移动到foo / pom.xml中的pluginManagement段来解决循环问题。