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

时间:2015-12-19 19:25:55

标签: java maven war

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

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

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

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

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

warName:

  • 生成的WAR的名称。
  • 类型:java.lang.String
  • 必填:是
  • 用户属性: war.warName
  • 默认值:$ {project.build.finalName}

failOnMissingWebXml:

  • 如果缺少web.xml文件,是否使构建失败。如果您希望在没有web.xml文件的情况下构建WAR,请设置为false。如果要构建没有web.xml文件的叠加层,这可能很有用。
  • 类型:布尔值
  • 自:2.1-alpha-2
  • 必填:否
  • 用户属性: failOnMissingWebXml
  • 默认值:true

(资料来源: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不起作用。

1 个答案:

答案 0 :(得分:3)

问题只是你错误的属性导致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模型中有一些东西来表示编码,这意味着要改变它,这在目前是不可能的。