可以相对于其定义的POM而不是任何子项扩展属性(ren)

时间:2016-05-07 10:06:31

标签: maven

我正在尝试在父聚合POM项目中设置几个属性,因此可用于所有模块项目:

<modules>
    <module>module1</module>
    <module>module2</module>
    <module>module3</module>
</modules>
<properties>
    <module1.dir>${project.basedir}</module1.dir>
    <module1.build.dir>4{project.basedir}/build</module1.build.dir>
</properties>

这些属性与各种目录相关,我打算将它们评估为相对于父POM

我想在第二个模块(module2)中引用上面的属性,如下所示:

${module1.build.dir}

但是,当我查看module2的有效POM时,会出现以下扩展结果:

<module1.build.dir>_project_root_directory_/module2/build</module1.build.dir>

我想要的是${module1.dir}等相对于父POM(定义它)的值。无论如何在Maven中执行此操作,或者我将不得不在脚本中设置一些环境变量来执行此操作?

尝试这样做的原因是我正在做一个不寻常的构建,module1是一个纯本机库,module2是一个依赖于module1和{的{JNI库{1}}是一个纯Java库,直接依赖于module3

1 个答案:

答案 0 :(得分:1)

不,maven继承第一(所以通过组合所有父母来构建一个叶子pom的有效pom),然后才评估属性。

这意味着在您的情况下,始终在子pom的上下文中评估属性。

这是maven行为正常的要求。查看super pom,您会看到以下内容:

<build>
    <directory>${project.basedir}/target</directory>
    ...
</build>

定义查找源的位置以及写入目标类的位置。它们必须在继承后评估(在孩子的背景下)。

解决方法 你可以使用像${project.parent.basedir}这样的属性值,或者你可以&#34;侧身看&#34;使用../sibling-module/whatever。这些都不是很好。

<强>替代 对于涉及本机组件的maven构建,你看过maven nar plugin吗?它专门为这些情况而开发。