无法从父pom.xml解析子pom.xml中的$ {project.version}

时间:2014-11-11 06:02:13

标签: maven maven-2 maven-3 pom.xml

我有一个项目层次结构:

A - pom.xml
|__ B - pom.xml
    |__ C - pom.xml

属性project.version在A中定义的pom.xml中定义。其他两个pom指定父标记和相应父pom的相应相对路径。

<parent>
        <groupId>com.GRP.id</groupId>
        <artifactId>ARTIFACT_ID</artifactId>
        <version>${project.version}</version>
        <relativePath>../pom.xml</relativePath>
</parent>

这里的问题是maven无法解析 $ {project.version} 并且正在按原样使用它。从A / B / C执行时抛出以下异常:

[ERROR] The build could not read 1 project -> [Help 1]
org.apache.maven.project.ProjectBuildingException: Some problems were encountered while processing the POMs:
[FATAL] Non-resolvable parent POM for com.project_name.module_name:sub_module_name:[unknown-version]: Could not transfer artifact com.project_name.module_name:module_name:pom:${project.version} from
to env-module_name-all-repos (REPO_URL): Illegal character in path at index 96: https://DEMO
/artifactory/env-module_name-all-repos/com/project_name/module_name/module_name/${project.version}/module_name-${project.version}.pom and 'parent.relativePath' points at wrong
local POM @ com.project_name.module_name:sub_module_name:[unknown-version], C:\WorkSpaces\Repository\sub_module_name\pom.xml, line 10, column 10

有关如何从子POM访问相同内容的任何建议。

3 个答案:

答案 0 :(得分:10)

@Sumit,

Maven在项目自己的<parent>groupId和{之前检查artifactId块及其包含的versiongroupIdartifactId {1}}。

因此,您应该避免在version块中看起来像${...}的任何内容。相反的情况是可以的:父类的属性可以在pom文件的其他地方引用:

<parent>

以这种方式思考:如果你有一个儿子或女儿,你可以选择自己命名 - 但在你的孩子之后命名毫无意义自从你首先成立以来!

希望有所帮助。

修改

让我们再看看你的示例pom:

<project>

    <!-- parent's GAV: inspected first, cannot use tokens -->
    <parent>
        <groupId>com.GRP.id</groupId>
        <artifactId>parent-id</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <!-- project's GAV: inspected second, may reference parent -->
    <groupId>${parent.groupId}</groupId>
    <artifactId>child-id</artifactId>
    <version>${parent.version}</version>
    <properties>
        <some.prop.name>${parent.artifactId}</some.prop.name>     <!-- parent-id -->
        <some.other.prop>${project.artifactId}</some.other.prop>  <!-- child-id -->
    </properties>
</project>

因此,在您孩子的pom.xml文件中,<parent> <groupId>com.GRP.id</groupId> <artifactId>ARTIFACT_ID</artifactId> <version>${project.version}</version> <!-- value doesn't exist yet --> <relativePath>../pom.xml</relativePath> </parent> 块包含对<parent>的引用。但如上所述,由于${project.version}块是我们评估的第一件事,因此该值尚不存在。

如果您按如下方式更改,一切都会好起来的:

<parent>

编辑2

最后一点信息。

请记住,当您最初在命令行上运行<parent> <groupId>com.GRP.id</groupId> <artifactId>ARTIFACT_ID</artifactId> <!-- EDIT 3A: parent.version is mandatory and must be a static value --> <version>1.0-SNAPSHOT</version> <relativePath>../pom.xml</relativePath> </parent> <groupId>com.GRP.id</groupId> <artifactId>CHILD_ARTIFACT_ID</artifactId> <!-- EDIT 3B: project.version is optional, can be deleted <version>${parent.version}</version> --> 时,您将从子pom的目​​录运行。

Maven还不知道父级的pom.xml文件在哪里

必须使用mvn compile块来确定pom文件的位置,然后才能读取文件的内容。

希望澄清事情。

答案 1 :(得分:1)

我想分享我的工作,我正在使用maven 3.5.2

  1. 运行mvn版本:set,它将更新父模型和子模块中父版本。

  2. 构建聚合pom或父pom,它应构建所有子模块

  3. 如果您有本地存储库或nexus存储库,请使用更新版本推送更改。

  4. 现在所有子模块都有一个在步骤1中设置的固定父版本,我们可以将子模块用作多个项目的依赖项。

答案 2 :(得分:0)

Maven允许你在孩子的POM中使用$ {project.version}。它只是通过查找您使用relativePath标记指定的父POM来查找父代的版本。

你碰巧在使用詹金斯吗?如果是这样,这是詹金斯的一个已知问题。看看这个:https://issues.jenkins-ci.org/browse/JENKINS-23846

如果没有,您使用的是什么版本的Maven?

在一个不相关的注释中,relativePath的默认值是../pom.xml,因此如果您的项目遵循标准的多模块结构,则不需要显式指定(就像您的示例POM一样)。