如何在命令行中覆盖Maven属性?


91

我有以下由Maven 3.0.4运行的普通pom。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>test</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>

</project>

我试图像这样在命令行中覆盖默认设置:

mvn -Dproject.build.finalName=build clean package

但这被忽略了,我得到 test-1.0.jar。我试图更改其他属性,例如outputDirectory,目录,artifactId,但也失败了。

做这个事情的正确方法是什么?

Answers:


135

请参阅POM简介

finalName创建为:

<build>
    <finalName>${project.artifactId}-${project.version}</finalName>
</build>

解决方案之一是添加自己的属性:

<properties>
    <finalName>${project.artifactId}-${project.version}</finalName>
</properties>
<build>
    <finalName>${finalName}</finalName>
 </build>

现在尝试:

mvn -DfinalName=build clean package


5
那是唯一的方法吗?如果无法更改POM文件怎么办?
glaz666

1
我需要finalName通过命令行覆盖而不更改POM。那可行吗?
glaz666

1
好的,它不可用,因为您只能覆盖用户定义的属性,而不能覆盖Maven属性,因为它们是Model类的属性。解决方案在答案中进行了描述。
glaz666

7
要覆盖多个参数,请使用多个-D标志。如果有人想知道。
Matthias

3
此外,如果您要覆盖的属性具有句点,则可能需要将其括在单引号中,例如:mvn '-Dproject.build.finalName=build' clean package
Xantix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.