【问题标题】:maven-war-plugin ignores user property war.warNamemaven-war-plugin 忽略用户属性 war.warName
【发布时间】:2015-12-19 19:25:55
【问题描述】:

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

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

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

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

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

战争名称:

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

failOnMissingWebXml:

  • 如果 web.xml 文件丢失,是否使构建失败。如果您希望在没有 web.xml 文件的情况下构建 WAR,请设置为 false。如果您正在构建没有 web.xml 文件的叠加层,这可能会很有用。
  • 类型:布尔值
  • 自:2.1-alpha-2
  • 必填:否
  • 用户属性: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-pluginwar.warName 的 2.4 版按预期工作,但我仍然不明白为什么设置 project.build.finalName 不起作用。

【问题讨论】:

  • 你使用的是哪个版本的 maven war 插件?
  • 哈!我在 中没有任何内容,因此 maven 使用的默认版本是 2.2。我已经强制它使用 2.6 并且正确使用了 war.warName...谢谢。虽然他们的文档应该更新......

标签: java maven war


【解决方案1】:

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

【讨论】:

  • 谢谢,现在更有意义了。
  • 我不同意用户属性只能从命令行使用。因为相同的机制适用于例如maven.compiler.source。它在属性部分设置并由 maven-compiler-plugin 评估。 war.warName 用户属性确实没有被 maven-war-plugin 考虑,甚至在 3.1.0 等较新插件版本的文档中也没有提及。
  • war.WarName 的事情很简单,就是 removed with version 3+。除此之外,目的是为了方便而拥有一些属性,例如maven.compiler.targetmaven.compiler.source..但它们甚至不正确也不一致性,因为设置target/source是不够的..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多