为啥 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插件执行。
【讨论】:
我真的不明白为什么昨天我在<profile>
中看到它时会起作用...
根据您的 pom,您在默认激活的配置文件和 pluginManagement 中定义它,为什么?
好的,现在我看到您也将它放入配置文件中。我已经将它移到构建/插件中并且它可以工作 - 我想我会这样 :)
您是否有机会知道我如何将资源从 jar 依赖项复制到最终的 WAR 中? ^^
检查this SO post,基本上你可以在你的目标文件夹中解压依赖,然后从那里复制资源以上是关于为啥 maven-war-plugin 不打包我的文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 maven-war-plugin 中正确设置清单类路径
yuicompressor maven 插件和 maven-war-plugin
Could not calculate build plan: Plugin org.apache.maven.plugins:maven-war-plugin:2.2