Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven继承与属性评估_Maven_Maven 3_Pom.xml_Multi Module - Fatal编程技术网

Maven继承与属性评估

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

因为系统作用域被认为是不推荐使用的,而且很危险,所以我们使用本地存储库。存储库位于父文件夹中,并由大多数子模块使用。现在,包括回购协议在内的交易变得一团糟。提供URL有点像黑客

我们在子模块中尝试了
${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,您需要它,但它不存在于任何公共存储库中。它取代了(不鼓励的)系统作用域的使用。是的,我知道,但无论如何它没有意义。你应该使用一个存储库管理器并在那里处理它…所以你摆脱了这种黑客行为…你解决了这个问题吗?我也有同样的问题。你好,我是马特奥,你能看看这个吗-