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

gau*_*urs 2 maven-2 pom.xml maven-3 maven

我有一个项目层次结构:

A - pom.xml
|__ B - pom.xml
    |__ C - pom.xml
Run Code Online (Sandbox Code Playgroud)

该属性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>
Run Code Online (Sandbox Code Playgroud)

这里的问题是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
Run Code Online (Sandbox Code Playgroud)

关于如何从子POM访问相同的任何建议.

333*_*hin 12

@Sumit,

Maven的考察<parent>块及其包含的groupId,artifactIdversion之前的项目自身groupId,artifactIdversion.

所以你应该避免看起来像块${...}内的任何东西<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>
Run Code Online (Sandbox Code Playgroud)

想想这样说:如果你有一个儿子或女儿,你可以选择自己以后他们的名字-但它根本没有任何意义的名字,你以后你的孩子,因为你进入了存在第一!

希望有所帮助.

编辑:

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

<parent>
    <groupId>com.GRP.id</groupId>
    <artifactId>ARTIFACT_ID</artifactId>
    <version>${project.version}</version>      <!-- value doesn't exist yet -->
    <relativePath>../pom.xml</relativePath>
</parent>
Run Code Online (Sandbox Code Playgroud)

因此,在您孩子的pom.xml文件中,该<parent>块包含对该文件的引用${project.version}.但如上所述,该值尚不存在,因为<parent>块是我们评估的第一件事.

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

<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>
-->
Run Code Online (Sandbox Code Playgroud)

编辑2

最后一点信息.

请记住,当您最初mvn compile在命令行上运行时,您将从子pom的目​​录运行.

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

它必须使用<parent>块来确定pom文件的位置,然后才能读取文件的内容.

希望澄清事情.