【发布时间】:2018-01-18 18:44:33
【问题描述】:
我正在使用一个通过 Maven 生成 WAR 工件的模块。该模块有一个典型的src/main/webapp 目录。我正在使用 Maven 的 war 插件来补充 webapp 目录与另一个可以在构建时以编程方式提供的资源目录。所以我的插件在 POM 中是这样配置的:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<webResources>
<resource>
<directory>src/main/webapp.${flavor}</directory>
</resource>
</webResources>
</configuration>
</plugin>
${flavor} 默认为根 POM 中的一个值,或者可以选择在构建时使用以下内容覆盖:
mvn clean install -Dflavor=customer
问题是,如果战争插件找不到为资源提供的目录(即src/main/webapp.customer 不存在),它会在构建过程中死去。我的项目可以有多种风格,我宁愿不必为每种可能的风格创建一个空目录,只是为了安抚插件。
问题:有没有办法配置war插件在目录不存在时不使构建失败?如果没有,在构建时创建此目录不存在的最佳方法是什么?
谢谢。
更新
经过额外的思考和研究,我决定在构建时使用 maven-antrun-plugin 有条件地创建“flavored”目录。毕竟,如果构建需要目录存在——并且没有它就会死掉——那么构建应该确保目录存在。所以这是我的 antrun 插件执行:
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>created-flavored-resources-directory</id>
<phase>process-resources</phase>
<configuration>
<target>
<mkdir dir="src/main/webapp.${flavor}"/>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
仅当目录不存在时,执行才会创建目录。这允许我们有一个目录......或没有。一切正常。
【问题讨论】:
-
让我澄清一下,您希望它针对您正在引用但它不存在的资源构建?为什么不创建默认位置。展开的 WAR 的默认目录是 target/
。 finalName 通常采用 - 的形式。这个默认目录可以通过指定 webappDirectory 参数来覆盖。 -
Maven 用于组装 WAR 的默认目录是
src/main/webapp。像平常一样存在。webResource选项允许我们用其他资源补充 webapp 目录,而不是覆盖。所以这是一个有用的机制。flavor属性在构建期间用于其他事情,而不仅仅是这个特定的事情。因此,如果开发人员可以可选地为各种模块提供一个补充webapp目录以用于特定风格,如果该模块的功能需要它,那将是最灵活的。但如果它不存在,那也应该没问题。 -
你得到什么错误?
-
[错误] 无法在项目 my-project 上执行目标 org.apache.maven.plugins:maven-war-plugin:2.4:war (default-war):执行目标 org 的默认战争.apache.maven.plugins:maven-war-plugin.2.4:war failed: basedir /path/to/webapp/my-project/src/main/webapp.customer 不存在 -> [帮助1]
标签: java maven maven-3 maven-plugin maven-war-plugin