Maven无法解析本地父POM

时间:2013-11-04 10:32:03

标签: java maven pom.xml parent-pom

这是一个有趣的问题,我不知道我做错了什么或者是Maven的限制。

最简单的场景版本是父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

5 个答案:

答案 0 :(得分:2)

您可以通过添加特殊配置文件来解决此问题,仅用于构建父级。

在您的孩子pom中将<relativePath />添加到<parent>标记。然后修改聚合器。

聚合群:

<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安装到本地repo,因此第二个命令不会失败。

但是,只有当您的父项目与子项目所需的版本相同时,此解决方案才有效。但是,假设您已经发布了父版本1.0,现在您正在使用1.1-SNAPSHOT版本的父版本,但是孩子使用发布的版本1.0。如果您现在要删除本地仓库,或者其他人将克隆您的项目,则使用-Pprepare构建将无法正常工作,因为这将安装parent-uber:1.1-SNAPSHOT并且子级仍将具有未解析的依赖项。

因此,要使用此功能,您需要拥有一个已发布parent-uber:1.0的外部存储库(nexus,artifactory等),并且您必须在<repositories>标记中提供此存储库在孩子pom。

当有很多子项目时,将常用设置放入父pom通常是个好主意,以避免重复代码。由于存储库对于所有项目都是通用的,因此您可能希望将其放在父级中。但是,如果您没有在本地安装父级并尝试安装子级,则maven不知道应该使用哪个存储库来下载父级。要避免此问题,您可以将该存储库的配置文件添加到.m2/settings.xml中,并建议您的所有团队成员也这样做。

答案 1 :(得分:0)

我不知道这是否是您问题的解决方案,但是:

指定父pom时,maven by default assumes it's located in the parent folder。这不是你的情况,所以你要么重新定义parent-java的parent部分中的相对路径指向../parent-uber,pom将在本地解析,或者<relativePath />,并且它将被远程解决。

答案 2 :(得分:0)

在我的情况下,定义的父pom版本与我在子pom中提到的版本不同,因此错误。一旦我更正了我的父pom.xml上的版本,它就开始正常工作 -

<version>2.1.0</version>

儿童pom条目看起来像

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

答案 3 :(得分:0)

根据这个guideline,maven多模块反应堆似乎不会自动分析父依赖关系。由于列表中未列出任何父依赖项。

  

在对项目进行排序时,以下关系得到遵守:

     
      
  1. 项目依赖于构建中的另一个模块
  2.   
  3. 插件声明插件是构建中的另一个模块
  4.   
  5. 插件依赖于构建中的另一个模块
  6.   
  7. 在构建中的另一个模块上构建扩展声明   元素中声明的顺序(如果没有其他规则适用)
  8.   

我验证maven确实通过分析子模块之间由标签定义的依赖图来确定构建顺序。

答案 4 :(得分:0)

嗯,我用另一种方式做到了。

就我而言,我也想要一个“父”,它也是一个“聚合器”。

因此,我创建了项目“父+聚合器”。

这是我的项目“父+聚合器”的pom.xml中的片段:

<groupId>com.test</groupId>
<artifactId>parent-testproject</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>

<modules>
    <module>../testprojectjpa</module>
    <module>../testprojectejb</module>
    <module>../testprojectweb</module>
    <module>../testprojectapp</module>
</modules>

<properties>
    <xstream.version>1.4.9</xstream.version>
    <dom4j.version>1.6.1</dom4j.version>
    <commons-lang.version>2.6</commons-lang.version>
    <commons-io.version>2.2</commons-io.version>
    <commons-beanutils.version>1.9.2</commons-beanutils.version>
    <commons-logging.version>1.1.2</commons-logging.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.thoughtworks.xstream</groupId>
        <artifactId>xstream</artifactId>
        <version>${xstream.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>${dom4j.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-lang</groupId>
        <artifactId>commons-lang</artifactId>
        <version>${commons-lang.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>${commons-io.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-beanutils</groupId>
        <artifactId>commons-beanutils</artifactId>
        <version>${commons-beanutils.version}</version>
        <scope>provided</scope>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>${commons-logging.version}</version>
        <exclusions>
            <exclusion>
                <groupId>*</groupId>
                <artifactId>*</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
</dependencies>

此后,我将“ testprojectejb”更改为引用“ parent-testproject”。

<parent>
    <groupId>com.test</groupId>
    <artifactId>parent-testproject</artifactId>
    <version>1.0.0</version>
    <!-- Find the project "parent + aggregator" that was compiled before of 
    the project testprojectejb -->
    <relativePath>../testproject/pom.xml</relativePath>
</parent>

<artifactId>testprojectejb</artifactId>
<packaging>ejb</packaging>
<name>Projeto testproject ejb</name>
<version>1.0.0</version>

因此,当我构建“ testproject”(parent-testproject)时,所有项目(包括父项目)都将构建。

我希望它有用。