我正在尝试在父聚合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
。
答案 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吗?它专门为这些情况而开发。