由于系统范围被称为弃用且危险,我们使用本地存储库。存储库位于父文件夹中,并由大多数子模块使用。现在包括回购变得凌乱。提供URL有点像黑客。
我们在子模块中尝试了${project.parent.basedir}/repo
,但这个评估为空。我们还尝试在父pom中设置它......
<repository>
<id>project_repo</id>
<url>file://${project.basedir}/project_repo</url>
</repository>
但是maven决定将URL发送给子模块,子模块又评估属性。这导致我们只是采取相对父目录的混乱,迫使子模块成为父pom的子文件夹:
<url>file://${project.basedir}/../project_repo</url>
这是问题Y。关于X的问题是,为什么maven在评估之前继承,我该如何避免这种情况?
答案 0 :(得分:2)
强制子模块成为父pom的子文件夹
无论其他问题如何,这实际上是一般推荐的方法,将多模块/聚合项目(父项)和子模块作为子文件夹,以便拥有一个中心/入口点文件夹(父项) )提供通用配置和治理(其pom.xml
文件)和模块(子文件夹)。
但是maven决定将URL发送给子模块,子模块又会对属性进行评估。
确实project.basedir
被评估为包含我们当前正在构建的pom.xml
的文件夹(或者在模块的情况下,子建筑),因为建筑项目是给定时间的模块
来自official documentation关于project.basedir
当前项目所在的目录。
如果您想要始终指向启动构建的文件夹(在本例中为聚合器/父项目),则可以改为使用session.executionRootDirectory
。
但是,要小心,特别是如果希望直接从其目录构建模块,您可能会遇到麻烦(路径问题):您应该始终使用像-pl
这样的反应器选项从父级运行它(项目到建立)。
这也是进一步思考的一个触发因素:项目的维护和可读性可能会受到这种影响。那么企业Maven存储库将是更好的解决方案。
进一步阅读SO:
更新
关于X的问题是,为什么maven在评估之前继承,我该如何避免这种情况?
关于你的X问题,这里是我能找到的解释:
答案依赖于Maven构建的核心,Maven Model Builder:
有效的模型构建器,具有配置文件激活,继承,插值,......
特别是,它按以下顺序执行以下步骤:
- 第1阶段
- 个人资料激活
- 原始模型验证
- 模型规范化
- 个人资料注入
- 父级决议直到super-pom
- 继承程序集
- 模型插值
- url normalization
大胆是我的。也就是说,它是这样做的,因为它的模型就是这样做的。