【问题标题】:How can I avoid build failing when Maven war plugin can't find webResource directory?当 Maven 战争插件找不到 webResource 目录时,如何避免构建失败?
【发布时间】: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


【解决方案1】:

我遇到了类似的问题(实际上是在搜索解决方案时发现了您的问题)。

我的观察和你的一样:directory 必须存在。但是,它不适用于&lt;include&gt;s。所以我希望即使webapp.${flavor} subdir 不存在也能通过:

<resource>
    <directory>src/main</directory>
    <includes>
        <include>webapp.${flavor}</include>
    </includes>
</resource>

缺点是你不能使用&lt;targetPath&gt;重命名目录。

我的背景:我有可选的目录,其中包含必须捆绑到战争中的内置文档。当docs-build 目录不存在时,directory=${project.basedir}/../docs-build + include=** 的组合不起作用。相比之下,directory=${project.basedir}/.. + include=docs-build 有效。 (最后我放弃了这种方法,因为我需要重命名 dir 但这是另一回事。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 2012-05-19
    • 1970-01-01
    • 2012-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多