2013-11-04 159 views
3

這是一個有趣的問題,我不知道我是否做錯了什麼或者它是Maven的限制。Maven不解決本地父項目POM

該場景的最簡單版本是有一個父POM,單個孩子POM和一個聚合POM。聚合POM僅僅是將模塊鏈接在一起。

當我安裝聚合POM時,它沒有找到父POM上的子POM的依賴關係。我不希望有一個相對路徑,應該可以從我對Maven工件的理解中得到。

任何有識之士將不勝感激。謝謝。

這是尤伯杯父(永遠記住,在它裏面沒有)

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.group</groupId> 
    <artifactId>parent-uber</artifactId> 
    <version>0.0.2-SNAPSHOT</version> 
    <packaging>pom</packaging> 

</project> 

這是孩子:

<?xml version="1.0" encoding="UTF-8"?> 
<project> 
    <modelVersion>4.0.0</modelVersion> 
    <parent> 
     <groupId>my.group</groupId> 
     <artifactId>parent-uber</artifactId> 
     <version>0.0.2-SNAPSHOT</version> 
    </parent> 

    <groupId>my.group</groupId> 
    <artifactId>parent-java</artifactId> 
    <packaging>pom</packaging> 

    <properties> 
    </properties> 

    <build> 
     <!-- To define the plugin version in your parent POM --> 
     <pluginManagement> 
      <plugins> 
       <!-- All projects that extend this should have valid JavaDoc built--> 
       <plugin> 
        <groupId>org.apache.maven.plugins</groupId> 
        <artifactId>maven-javadoc-plugin</artifactId> 
        <executions> 
         <execution> 
          <id>attach-javadocs</id> 
          <goals> 
           <goal>jar</goal> 
          </goals> 
         </execution> 
        </executions> 
       </plugin> 
      </plugins> 
     </pluginManagement> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>junit</groupId> 
       <artifactId>junit</artifactId> 
       <version>4.11</version> 
       <scope>test</scope> 
      </dependency>  
      <dependency> 
       <groupId>log4j</groupId> 
       <artifactId>log4j</artifactId> 
       <version>1.2.17</version> 
      </dependency>  
      <dependency> 
       <groupId>commons-lang</groupId> 
       <artifactId>commons-lang</artifactId> 
       <version>2.1</version> 
      </dependency>  
      <dependency> 
       <groupId>commons-io</groupId> 
       <artifactId>commons-io</artifactId> 
       <version>2.4</version> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 
</project> 

而對於完整性,聚合:

<project> 
    <modelVersion>4.0.0</modelVersion> 

    <parent> 
     <groupId>my.group</groupId> 
     <artifactId>_maven-integration-aggregator</artifactId> 
     <version>0.1-SNAPSHOT</version> 
     <relativePath>../pom.xml</relativePath> <!-- parent aggregator --> 
    </parent> 

    <groupId>my.group.maven</groupId> 
    <artifactId>_poms-aggregator</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <modules> 
     <module>parent-uber</module> 
     <module>parent-java</module> 
    </modules> 

</project> 

錯誤:

org.apache.maven.model.resolution.UnresolvableModelException: Could not find artifact my.group:parent-uber:pom:0.0.2-SNAPSHOT 
    at org.apache.maven.project.ProjectModelResolver.resolveModel(ProjectModelResolver.java:159) 
    at org.apache.maven.model.building.DefaultModelBuilder.readParentExternally(DefaultModelBuilder.java:817) 
    at org.apache.maven.model.building.DefaultModelBuilder.readParent(DefaultModelBuilder.java:669) 
    at org.apache.maven.model.building.DefaultModelBuilder.build(DefaultModelBuilder.java:307) 
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:411) 
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:380) 
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:496) 
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:380) 
    at org.apache.maven.project.DefaultProjectBuilder.build(DefaultProjectBuilder.java:344) 
    at org.apache.maven.DefaultMaven.collectProjects(DefaultMaven.java:637) 
    at org.apache.maven.DefaultMaven.getProjectsForMavenReactor(DefaultMaven.java:586) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:229) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:152) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:555) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:214) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:158) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 
Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not find artifact my.group:parent-uber:pom:0.0.2-SNAPSHOT 
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:459) 
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts(DefaultArtifactResolver.java:262) 
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact(DefaultArtifactResolver.java:239) 
    at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact(DefaultRepositorySystem.java:295) 
    at org.apache.maven.project.ProjectModelResolver.resolveModel(ProjectModelResolver.java:155) 
    ... 23 more 
Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact my.parent:parent-uber:pom:0.0.2-SNAPSHOT 
    at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve(DefaultArtifactResolver.java:449) 
    ... 27 more 
+2

愚蠢的問題:你安裝了父母 - 超級pom嗎? – nablex

+0

嘗試刪除孩子' parent-java'。我想Maven仍然會通過parent-uber – Boj

+0

來追蹤它。目標是讓它們都在聚合器中列出,並讓maven理解對parent-uber的依賴。所以不,我沒有安裝超級父母。我想同時安裝parent-uber和parent-java,或者至少自動安裝我的超級根聚合器(未顯示) –

回答

0

我不知道這是否是解決問題的方法,但是:

在指定父POM,Maven的by default assumes it's located in the parent folder。這不是你的情況,所以你必須重新定義父java的父節中的相對路徑指向../parent-uber,並且pom將在本地解析,或者以<relativePath />解析,並且它將被遠程解析。

+0

這是一個問題,因爲它迫使您在父依賴關係的上下文中組織所有項目。這真的不是我想要的。我希望能夠擴展父功能(依賴關係,插件等)並通過我們的存儲庫解決POM問題。 我通常理解Maven的嚴格定義好的結構,但這有點過頭了。 如果我有一個使用parent-uber或parent-java的新干淨項目,那麼它應該簡單地下載/解決該依賴項。 它會解決它,如果我'mvn安裝'在錯誤後的子項目再次。 –

+0

據我所知,我的評論涉及兩個問題。所以我會澄清。我只想知道是否有一種方法可以解決POM結構,而無需對相對路徑進行硬編碼。 Maven有資料在回購中解決這個問題,但不是。 –

+0

您是否在您的父聲明中用''嘗試過? – diegomtassis

0

在我的情況下,定義的父pom版本與我在子pom中提到的不一樣,因此也是錯誤。剛一開始工作的罰款,我糾正我的父pom.xml的版本 -

<version>2.1.0</version> 

孩子POM入口看起來像

<relativePath>../parent-pom</relativePath> 
1

您可以通過添加特殊型材建築只有家長解決這個問題。

在您的孩子pom中添加<relativePath /><parent>標記。然後修改聚合器。

聚合POM:

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.group.maven</groupId> 
    <artifactId>_poms-aggregator</artifactId> 
    <version>0.1-SNAPSHOT</version> 
    <packaging>pom</packaging> 

    <profiles> 
     <profile> 
      <id>default</id> 
      <activation> 
       <activeByDefault>true</activeByDefault> 
      </activation> 
      <modules> 
       <module>parent-uber</module> 
       <module>parent-java</module> 
      </modules> 
     </profile> 
     <profile> 
      <id>prepare</id> 
      <modules> 
       <module>parent-uber</module> 
      </modules> 
     </profile> 
    </profiles> 

</project> 

並用它來運行兩次打造,這樣的:

mvn install -Pprepare 
mvn install 

首先命令安裝父母的POM到本地回購,所以第二個命令不會失敗。

但是,只有當您的父項目具有與孩子需要的版本相同的版本時,此解決方案纔有效。但假設您已經發布了父版本1.0,現在您正在使用1.1-SNAPSHOT版本的父版,但是孩子使用的是已發佈版本1.0。如果您現在要刪除本地回購,或者其他人將克隆您的項目,則使用-Pprepare進行構建將不起作用,因爲這將安裝parent-uber:1.1-SNAPSHOT,並且子項仍將具有未解決的依賴關係。

因此,爲了實現這個目標,您需要有一個外部存儲庫(nexus,artifactory等),您已經發布了parent-uber:1.0,您必須在子pom中的<repositories>標記中提供此回購。

當有很多子項目時,將常見設置放入父項目通常是一個好主意,以避免重複代碼。由於存儲庫對於所有項目都很常見,所以您可能希望將其放入父項中。但是,如果你沒有在本地安裝父進程並嘗試安裝子進程,那麼Maven不知道應該使用哪個庫來下載父進程。爲了避免這個問題,您可以將該資料庫添加到.m2/settings.xml中,並建議您的所有團隊成員也這樣做。

0

根據這個guideline,似乎父母依賴不是由maven multi-modules reactor自動分析的。由於在列表中沒有列出父親依賴關係。

The following relationships are honoured when sorting projects:

  1. project dependency on another module in the build
  2. plugin declaration where the plugin is another modules in the build
  3. plugin dependency on another module in the build
  4. build extension declaration on another module in the build the order declared in the element (if no other rule applies)

我通過分析子模塊之間由標籤定義的依賴關係圖來確定maven的確確定了構建順序。