Maven 安装不考虑命令行参数

Maven install not respecting command line arguments

我有一个项目正在尝试使用 maven 安装。 pom.xml 有一些属性在 maven install 命令为 运行 时修改,具体取决于我们尝试构建的库版本:

<properties>
  <some-version>0</some-version>
</properties>

这里的零是一个占位符,因为我们总是会在构建过程中指定合法版本。然后稍后在 pom.xml 中引用该版本以指定一些依赖项:

  <dependencies>
    <dependency>
      <groupId>com.mycompany.myproduct</groupId>
      <artifactId>someOtherProject</artifactId>
      <version>${some-version}</version>
    </dependency>
  </dependencies

使用以下命令行通过 make 完成构建:

mvn -Dsome-version=1.6.2

Maven 能够正确解析版本并按预期构建。但是,在我的本地 Maven 存储库 (/home/user/.m2) 中安装的版本没有正确的版本。安装的pom.xml没有我在命令行设置的更新版本:

user@ubuntu:~/$ cat /home/user/.m2/repository/com/mycompany/myproduct/myproject/1.0.0/myproject-1.0.0.pom | grep some-version -C 1

  <properties>
    <some-version>0</some-version>
  </properties>
--
      <artifactId>someOtherProject</artifactId>
      <version>${some-version}</version>
    </dependency>
user@ubuntu:~/$ 

这会阻止依赖于 myproject 的任何其他项目能够构建,因为 maven 会抱怨它找不到 someOtherProject 的版本 0:

[ERROR] Failed to execute goal on project myproject: 
Could not resolve dependencies for project mycompany.myproduct:myproject:jar:1.0.0: 
The following artifacts could not be resolved: com.mycompany.myproduct:someOtherProject:jar:0, 
Could not find artifact com.mycompany.myproduct:someOtherProject:jar:0 in central (https://mycompany.com/artifactory/repo/) -> [Help 1]

我需要做什么才能让maven在pom中安装更新版本?显然,一个糟糕的 hackish 解决方案是使用 sed 并直接修改 pom 文件,但似乎 Maven 应该能够在安装 pom 时实际利用命令行设置。否则,在命令行上设置参数的能力似乎非常有限。

你最好在 <properties> 标签中的 pom.xml 中设置你的 属性 像这样 -

<properties>
    <property>
        <name>some-version</name>
        <value>1.6.2</value>
    </property>
</properties>  

如果您使用它,那么您不必每次从终端发出 mvn 命令时都提供 属性。

mvn -Dsome-version=1.6.2 作为构建范围的替代值,而不是用新值替换原始 POM。这就是您看到的行为。我不知道有任何 Maven 支持这样做。

在@JoopEggen 的建议下,我深入研究了 maven 版本插件。它提供了一个 update-属性 目标,它实际上会更新磁盘上的 pom.xml 值,而不是仅仅在构建阶段传入覆盖。我能够通过调用

来解决我的问题
mvn versions:update-property -Dproperty=some-version -DnewVersion=1.6.2 -DsearchReactor=false -DallowSnapshots=true

在调用 mvn install 之前的 makefile 中。禁用 reactor 是必要的,以防止插件拒绝它在远程 repo 中找不到的值(参见 here),allowSnapshots 允许我使用版本号,例如 1.6.2-SNAPSHOT,这在测试时很有用。