Maven:Pom文件 - 将依赖版本外部化到属性文件

pcs*_*pcs 5 maven

我想将POM文件中的依赖版本外部化为属性文件.

例: pom.xml

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>${externalized.junit.version}</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

abc.properties

externalized.junit.version=4.8.2
Run Code Online (Sandbox Code Playgroud)

可以这样做吗?如果是这样,最好的方法是什么?

Tun*_*aki 5

不,你不能那样做。

当您在项目上启动 Maven 命令时,它采取的第一个操作是创建项目的有效模型。这尤其意味着读取您的 POM 文件、使用激活的配置文件进行推理、应用继承、对属性执行插值......所有这些都是为了构建最终的 Maven 模型。这个工作是由Maven Model Builder组件完成的,它的入口点是ModelBuilder接口,出口点是Model类。

构建模型的过程相当复杂,很多步骤可能分为 2 个阶段,但问题的关键很简单:在该步骤的最后,有一个有效的模型可供 Maven 使用。这意味着所有依赖项都必须具有有效的组 ID、工件 ID、版本;没有重复的依赖项,没有具有相同 ID 的插件执行等(请参阅模型描述)。

请注意,在模型构建期间,正在发生插值,这意味着如果当时某个属性可用,并且已被使用,例如${myProperty},那么它将被替换为其相应的值。可用的属性包括:

  • POM 内容,如${project.version}${project.artifactId}
  • ${project.basedir}, 对应于 所在的目录pom.xml
  • 使用-D开关在命令行上设置的用户属性(如-DmyProperty=myValue);
  • 直接在 POM 文件中设置的任何属性,在<properties>元素内;
  • 几个内置的 Maven 属性,如${maven.build.timestamp},表示构建开始的日期/时间,或${maven.version}当前 Maven 版本;
  • Java 系统属性,由 System.getProperties()
  • 环境变量;
  • 最后settings.xml文件中设置属性。

这里的关键点是,当构建有效模型时,依赖项的版本必须是有效的。这是确保依赖图在构建过程中稳定和一致的唯一方法。

这正是这里失败的原因:您希望 Maven 能够读取属性文件中的版本,因此这意味着将插件绑定到生命周期的特定阶段以读取该文件并以某种方式引用使用标准读取的属性马文属性。问题是,这一切都将发生在模型已经建立之后,所以为时已晚。所有这些过程都发生在构建生命周期开始之前;在此之前没有机会调用插件。

这也意味着,如果您将属性定义为命令行属性,它会起作用(因为如上所述,它在构建模型的插值过程中可用)。但这不是最佳实践:将依赖项版本指定为命令行属性会使构建很难重现。最好将其指定为<properties>POM 元素内的 Maven 属性,或者<dependencyManagement>在父 POM 中使用该方案或导入 BOM