Maven安装不遵守命令行参数

时间:2015-05-08 14:16:55

标签: java maven command-line-arguments pom.xml

我有一个项目,我试图用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时实际利用命令行设置。否则,在命令行上设置参数的能力似乎在效率上非常有限。

3 个答案:

答案 0 :(得分:1)

更好的是,您可以在pom.xml标记<properties>中设置您的属性,如下所示 -

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

来解决我的问题
mvn versions:update-property -Dproperty=some-version -DnewVersion=1.6.2 -DsearchReactor=false -DallowSnapshots=true
在调用mvn install之前,在makefile中

。必须禁用反应器以防止插件拒绝它在远程仓库中找不到的值(请参阅here),而允许允许我使用版本号,例如1.6.2-SNAPSHOT,这在测试