2010-12-21 79 views
4

有一個多模塊Maven-3項目,其中一個子模塊在所有其他模塊中用作<dependency>。同時,所有子模塊都從父模塊繼承。這樣的結構導致循環依賴。我該如何解決它?如何解決補充Maven子模塊中的循環依賴關係?

項目結構比較典型:

/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繼承的子模塊,但同時也是依賴項。

回答

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插件配置從構建/插件移動打造父pom.xml文件/ pluginManagment /插件。然後,你要CHECKSTYLE執行每個模塊中,將它添加到每個模塊的pom.xml文件的生成/插件部分:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-checkstyle-plugin</artifactId> 
</plugin> 

這將調用該模塊的插件,並在父pom.xml中指定的配置pluginManagement部分將被應用。您可以通過在該模塊上運行mvn help:effective-pom來驗證該功能是否正常工作。

1

因此,我認爲父pom是引用其中一個子模塊作爲依賴?我會建議如果你有任何構建邏輯在父模塊中進行,你把它推到一個新的子模塊。家長應限制爲指定<modules>,<pluginManagement><dependencyManagement>部分。所有其他的工作應該放在子模塊上。

有關詳情,請諮詢以下關於組織多模塊項目:

http://www.sonatype.com/books/mvnref-book/reference/pom-relationships-sect-pom-best-practice.html

+0

我需要在``中使用``部分,因爲我必須在那裏聲明插件``,這對所有子模塊都很常見(請參閱我的問題更新)。 – yegor256 2010-12-21 21:17:25

+0

請注意,沒有什麼能夠阻止您在``部分中指定``。 – 2010-12-22 07:40:24

2

我同意Tim Clemons's answer,但也有一種選擇,使您的項目嵌套。

     root 
        /  \ 
       common sub-root 
         / | \ 
         sub1 sub2 sub3 

定義依賴性commonsub-root POM。我並不是說這是最佳做法,但它是解決您的問題的方法。

+0

我喜歡這個想法,但它會使項目比現在更混亂。我最好將我的`foo-testkit`移出繼承樹。這是直接的解決方案,但不夠優雅。 (見上面更新的問題) – yegor256 2010-12-21 21:16:12

0

如果您在foo(僅在其子模塊中)實際上不需要它,可以通過將插件定義從構建段移至foo/pom.xml中的pluginManagement段來解決循環問題。