2013-11-04 95 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的确确定了构建顺序。