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