为啥 maven-war-plugin 不打包我的文件?

Posted

技术标签:

【中文标题】为啥 maven-war-plugin 不打包我的文件?【英文标题】:Why is maven-war-plugin not packaging my files?为什么 maven-war-plugin 不打包我的文件? 【发布时间】:2016-06-04 11:32:34 【问题描述】:

我不知道为什么,但maven-war-plugin 停止将我的文件移动到WEB-INF/config。这就是我使用插件的方式:

<profiles>
    <profile>       
        <id>default-profile</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>   
        <build>
            <pluginManagement> 
                <plugins>   
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-war-plugin</artifactId>
                        <version>2.6</version>
                        <configuration>
                            <webResources>
                                <resource>
                                    <directory>$basedir/src/main/assembly/$package-mode/config</directory>
                                    <filtering>true</filtering>
                                    <targetPath>WEB-INF/config</targetPath>
                                </resource>
                            </webResources>
                        </configuration>
                    </plugin>  
                </plugins>
            </pluginManagement>
        </build>    
    </profile>
</profiles>

问题:我可以做些什么来再次打破这个问题?终于成功了,现在不行了。

这就是我运行服务器的方式:

mvn tomcat7:run-war -Denv=dev -Dpackage-mode=dev -DskipTests

WAR 文件已构建并打包,但来自src/main/assembly/dev/config 的文件根本不存在。

【问题讨论】:

离题:请不要使用配置文件来制作特定于环境的工件。无论争论如何,这个概念都是始终拥有相同的工件。出于您的目的,请考虑使用github.com/khmarbaise/multienv-maven-plugin 作为清洁解决方案。 @displayname 我看到您在 pom 中定义了 maven-antrun-plugin 并带有我无法相信的评论?需要什么 maven-antrun-plugin ? @khmarbaise 哦,这实际上与这里的这个特定问题无关,但我必须添加它for another reason。到目前为止,我已经更改了我的 pom.xml,并且我使用的是 maven-war-plugin 而不是 maven-antrun-plugin。然而,奇怪的是,这条评论竟然是真的。 基于另一个问题,您试图违反配置范式的约定,这会导致您遇到此类问题。通过 antrun 做这样的事情是完全错误的...... @khmarbaise 我没有将 Maven 用于依赖管理之外的其他用途——不幸的是,目前所有这些都超出了我的想象。使用 antrun 对我来说似乎是合理的,但在 A. Di Matteo 建议 maven-war-plugin 之后,我意识到这绝对是更好的选择。说到“使用什么插件”,如果我需要将 jar (依赖项)中的资源“注入”到我的 WAR 中怎么办 - 这里有关于插件的任何建议吗? ^^ 【参考方案1】:

根据您的问题运行下面的最小 pom:

<project>
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.sample</groupId>
    <artifactId>web-sample</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>

    <profiles>
        <profile>
            <id>default-profile</id>
            <activation>
                <activeByDefault>true</activeByDefault>
            </activation>
            <build>
                <pluginManagement>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-war-plugin</artifactId>
                            <version>2.6</version>
                            <configuration>
                                <webResources>
                                    <resource>
                                        <directory>$basedir/src/main/assembly/$package-mode/config</directory>
                                        <filtering>true</filtering>
                                        <targetPath>WEB-INF/config</targetPath>
                                    </resource>
                                </webResources>
                            </configuration>
                        </plugin>
                        <plugin>
                            <groupId>org.apache.tomcat.maven</groupId>
                            <artifactId>tomcat7-maven-plugin</artifactId>
                            <version>2.0</version>
                        </plugin>
                    </plugins>
                </pluginManagement>
            </build>
        </profile>
    </profiles>
</project>

并执行 Maven 如下:

mvn tomcat7:run-war -Dpackage-mode=dev

文件被正确复制,构建日志也指定:

[INFO] --- maven-war-plugin:2.6:war (default-war) @ web-sample ---   
[INFO] Packaging webapp   
[INFO] Assembling webapp [web-sample] in [C:\Development\workspace-mars\web-sample\target\web-sample]   
[INFO] Processing war project   
[INFO] Copying webapp webResources [C:\Development\workspace-mars\web-sample/src/main/assembly/dev/config] to [C:\Development\workspace-mars\web-sample\target\web-sample]   
[INFO] Copying webapp resources [C:\Development\workspace-mars\web-sample\src\main\webapp]   
[INFO] Webapp assembled in [106 msecs]   
[INFO] Building war: C:\Development\workspace-mars\web-sample\target\web-sample.war   
[INFO]     
[INFO] <<< tomcat7-maven-plugin:2.0:run-war (default-cli) < package @ web-sample <<<   

因此错误出现在您的项目或 POM 配置中的其他位置。

我建议运行一个

mvn clean

然后重试。另外,运行一个

mvn clean package

并检查文件是否被复制,无论tomcat7插件执行。

【讨论】:

我真的不明白为什么昨天我在&lt;profile&gt; 中看到它时会起作用... 根据您的 pom,您在默认激活的配置文件和 pluginManagement 中定义它,为什么? 好的,现在我看到您也将它放入配置文件中。我已经将它移到构建/插件中并且它可以工作 - 我想我会这样 :) 您是否有机会知道我如何将资源从 jar 依赖项复制到最终的 WAR 中? ^^ 检查this SO post,基本上你可以在你的目标文件夹中解压依赖,然后从那里复制资源

以上是关于为啥 maven-war-plugin 不打包我的文件?的主要内容,如果未能解决你的问题,请参考以下文章

maven打包的时候会忽略掉空文件夹,怎样配置让它不忽略

如何在 maven-war-plugin 中正确设置清单类路径

为啥这个结构不打包?

Maven -- 在进行war打包时排除不需要的文件

yuicompressor maven 插件和 maven-war-plugin

Could not calculate build plan: Plugin org.apache.maven.plugins:maven-war-plugin:2.2