Maven继承和属性评估

时间:2016-06-06 13:14:54

标签: maven maven-3 pom.xml multi-module

由于系统范围被称为弃用且危险,我们使用本地存储库。存储库位于父文件夹中,并由大多数子模块使用。现在包括回购变得凌乱。提供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在评估之前继承,我该如何避免这种情况?

1 个答案:

答案 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
    •   
  •   

大胆是我的。也就是说,它是这样做的,因为它的模型就是这样做的。