maven-war-plugin 忽略用户 属性 war.warName

maven-war-plugin ignores user property war.warName

如果我在我的 POM 中添加以下 属性,maven-war-plugin 会正确使用它:

<properties>
    <failOnMissingWebXml>false</failOnMissingWebXml>
</properties>

但是,如果我添加以下 属性 插件将忽略它(生成的 WAR 具有默认名称,即 artifactId-version):

<properties>
    <war.warName>${project.artifactId}</war.warName>
</properties>

以下是 maven-war-plugin 文档的两个摘录:

战争名称:

failOnMissingWebXml:

(来源:https://maven.apache.org/plugins/maven-war-plugin/war-mojo.html

为什么 failOnMissingWebXmlwar.warName 之间的行为不同?

此外,如果其他插件可以使用值 ${project.build.sourceEncoding},为什么 maven-war-plugin 不能使用 ${project.build.finalName} 的值?

<properties>
    <!-- plugins use these values correctly -->
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <failOnMissingWebXml>false</failOnMissingWebXml>

    <!-- not "found" by maven-war-plugin -->
    <war.warName>${project.artifactId}</war.warName>
    <project.build.finalName>${project.artifactId}</project.build.finalName>
</properties>

非常感谢! :)

编辑:由于 maven-war-plugin war.warName 的 2.4 版按预期工作,但我仍然不明白为什么设置 project.build.finalName 不起作用。

问题只是你弄错了 属性 因为 user property 通常用于这样的命令:

mvn -Dwar.warName=xxx war:war

如果你想在 pom 文件中使用它,你必须像这样使用它:

  <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.6</version>
        <configuration>
          <warName>WhatEverYouLike</warName>
        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...

并且您不应该在 pom 中使用属性来定义此类内容。最好为此使用配置标签。

${project.build.finalName}应该这样使用:

<project..>
  <build>
    <finalName>WhatYouLIke</finalName>
    ..
  </build>
</project>

如果你查看 maven model.

就可以看到结构

${project.build.sourceEncoding} 的用法只是 Maven 插件中的一个约定,因此您可以定义 属性 ,它被大量插件拾取用于源代码编码(我必须承认这有点误导)。背后的最初想法是在 maven 模型中有一些东西来表示编码,这意味着改变它,这在目前是不可能的。