Maven继承与属性评估
因为系统作用域被认为是不推荐使用的,而且很危险,所以我们使用本地存储库。存储库位于父文件夹中,并由大多数子模块使用。现在,包括回购协议在内的交易变得一团糟。提供URL有点像黑客 我们在子模块中尝试了Maven继承与属性评估,maven,maven-3,pom.xml,multi-module,Maven,Maven 3,Pom.xml,Multi Module,因为系统作用域被认为是不推荐使用的,而且很危险,所以我们使用本地存储库。存储库位于父文件夹中,并由大多数子模块使用。现在,包括回购协议在内的交易变得一团糟。提供URL有点像黑客 我们在子模块中尝试了${project.parent.basedir}/repo,但结果是无效。我们还尝试在父pom中设置它 <repository> <id>project_repo</id> <url>file://${project.basedir}/proj
${project.parent.basedir}/repo
,但结果是无效。我们还尝试在父pom中设置它
<repository>
<id>project_repo</id>
<url>file://${project.basedir}/project_repo</url>
</repository>
回购计划
文件://${project.basedir}/project\u repo
但是maven决定将url发送给子模块,子模块反过来评估属性。这导致我们陷入了只获取相对父目录的混乱,迫使子模块成为父pom的子文件夹:
<url>file://${project.basedir}/../project_repo</url>
文件://${project.basedir}/./project\u repo
这就是问题所在。关于X的问题是,为什么maven在求值之前继承,我如何避免这种情况
强制子模块成为父pom的子文件夹
不管其他面临的问题如何,这实际上是通常推荐的方法,将多模块/聚合项目(父级)和子模块作为子文件夹,以便有一个中央/入口点文件夹(父级)提供公共配置和管理(其pom.xml
文件)和模块(子文件夹)
但是maven决定将url发送给子模块,子模块反过来评估属性
实际上,project.basedir
被评估为包含我们当前正在构建的pom.xml
的文件夹(如果是模块,则为子构建),因为构建项目是给定时间的模块。来自关于
project.basedir
当前项目所在的目录
如果希望始终指向启动生成的文件夹(即本例中的聚合器/父项目),可以使用session.executionRootDirectory
但是,要特别小心,如果希望直接从其目录构建模块,则可能会遇到问题(路径问题):您应该始终使用反应器选项(如-pl
)(要构建的项目)从父级运行模块
这也是引发进一步思考的原因:项目的维护和可读性可能会受到这种方法的影响。因此,企业Maven存储库将是一个更好的解决方案
进一步阅读:
更新 关于X的问题是,为什么maven在求值之前继承,我如何避免这种情况 关于你的X问题,以下是我可以找到的解释: 答案取决于Maven构建的核心,即: 有效的模型生成器,配置文件激活,继承,插值 具体而言,它按以下顺序执行以下步骤:
- 第一阶段
- 轮廓激活
- 原始模型验证
- 模型规范化
- 剖面注入
- 父级分辨率直到超级pom
- 继承程序集
- 模型插值
- url规范化
博尔德是我的。也就是说,它这样做是因为它是由它的模型来实现的。这个基于文件的存储库的目的是什么,这通常是一个坏主意…或者使用本地缓存
$HOME/.m2/repository
,使用存储库管理器是个好主意…您误解了项目的目的。它是一个repo,相当于中央maven repo,而不是.m2
中的本地缓存。其目的是保存第三方JAR,您需要它,但它不存在于任何公共存储库中。它取代了(不鼓励的)系统作用域的使用。是的,我知道,但无论如何它没有意义。你应该使用一个存储库管理器并在那里处理它…所以你摆脱了这种黑客行为…你解决了这个问题吗?我也有同样的问题。你好,我是马特奥,你能看看这个吗-