所有 Maven 项目的默认资源目录都src/main/resources
将target/classes
在WEB-INF/classes
WAR 中结束。目录结构将在此过程中保留。
WAR 插件还能够通过参数包含在默认资源目录中找不到的资源webResources
。
<project> ... <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.3.2</version> <configuration> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>resource2</directory> </resource> </webResources> </configuration> </plugin> </plugins> </build> ... </project>
在使用部分使用我们的示例项目并添加外部资源,如下所示:
. |-- pom.xml |-- resource2 | |-- external-resource.jpg | `-- image2 | `-- external-resource2.jpg `-- src `-- main |-- java | `-- com | `-- example | `-- projects | `-- SampleAction.java |-- resources | `-- images | `-- sampleimage.jpg `-- webapp |-- WEB-INF | `-- web.xml |-- index.jsp `-- jsp `-- websource.jsp
最终会在战争中成为:
documentedproject-1.0-SNAPSHOT.war |-- META-INF | |-- MANIFEST.MF | `-- maven | `-- com.example.projects | `-- documentedproject | |-- pom.properties | `-- pom.xml |-- WEB-INF | |-- classes | | |-- com | | | `-- example | | | `-- projects | | | `-- SampleAction.class | | `-- images | | `-- sampleimage.jpg | `-- web.xml |-- external-resource.jpg |-- image2 | `-- external-resource2.jpg |-- index.jsp `-- jsp `-- websource.jsp
external-resource2.jpg
并被image2
复制到 WAR 的根目录,保留目录结构。
webResources
是资源列表。支持所有资源选项。
一个网络资源
要在 WAR 中包含所有 jpg,我们可以将以下内容添加到上面的 POM 配置中:
... <configuration> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>resource2</directory> <!-- the list has a default value of ** --> <includes> <include>**/*.jpg</include> </includes> </resource> </webResources> </configuration> ...
image2
要从WAR 中排除目录,请添加:
... <configuration> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>resource2</directory> <!-- there's no default value for this --> <excludes> <exclude>**/image2</exclude> </excludes> </resource> </webResources> </configuration> ...
混合包含和排除时要小心,排除将具有更高的优先级。如果资源同时匹配,则包含不能覆盖排除。
具有此配置将从 WAR 中排除所有 jpg:
... <configuration> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>resource2/</directory> <!-- the list has a default value of ** --> <includes> <include>image2/*.jpg</include> </includes> <!-- there's no default value for this --> <excludes> <exclude>**/*.jpg</exclude> </excludes> </resource> </webResources> </configuration> ...
这是另一个如何指定包含和排除模式的示例:
... <configuration> <webResources> <resource> <!-- this is relative to the pom.xml directory --> <directory>resource2</directory> <!-- the default value is ** --> <includes> <include>**/pattern1</include> <include>*pattern2</include> </includes> <!-- there's no default value for this --> <excludes> <exclude>*pattern3/pattern3</exclude> <exclude>pattern4/pattern4</exclude> </excludes> </resource> </webResources> </configuration> ...
使用上面的示例,我们还可以为我们的资源配置过滤器。我们将在我们的项目中添加一个假设configurations
目录:
. |-- configurations | |-- config.cfg | `-- properties | `-- config.prop |-- pom.xml |-- resource2 | |-- external-resource.jpg | `-- image2 | `-- external-resource2.jpg `-- src `-- main |-- java | `-- com | `-- example | `-- projects | `-- SampleAction.java |-- resources | `-- images | `-- sampleimage.jpg `-- webapp |-- WEB-INF | `-- web.xml |-- index.jsp `-- jsp `-- websource.jsp
为防止在启用过滤时损坏二进制文件,您可以配置不会被过滤的文件扩展名列表。
... <configuration> <!-- the default value is the filter list under build --> <!-- specifying a filter will override the filter list under build --> <filters> <filter>properties/config.prop</filter> </filters> <nonFilteredFileExtensions> <!-- default value contains jpg,jpeg,gif,bmp,png --> <nonFilteredFileExtension>pdf</nonFilteredFileExtension> </nonFilteredFileExtensions> <webResources> <resource> <directory>resource2</directory> <!-- it's not a good idea to filter binary files --> <filtering>false</filtering> </resource> <resource> <directory>configurations</directory> <!-- enable filtering --> <filtering>true</filtering> <excludes> <exclude>**/properties</exclude> </excludes> </resource> </webResources> </configuration> ...
config.prop
interpolated_property=some_config_value
config.cfg
<another_ioc_container> <configuration>${interpolated_property}</configuration> </another_ioc_container>
由此产生的 WAR 将是:
documentedproject-1.0-SNAPSHOT.war |-- META-INF | |-- MANIFEST.MF | `-- maven | `-- com.example.projects | `-- documentedproject | |-- pom.properties | `-- pom.xml |-- WEB-INF | |-- classes | | |-- com | | | `-- example | | | `-- projects | | | `-- SampleAction.class | | `-- images | | `-- sampleimage.jpg | `-- web.xml |-- config.cfg |-- external-resource.jpg |-- image2 | `-- external-resource2.jpg |-- index.jsp `-- jsp `-- websource.jsp
的内容config.cfg
是:
<another_ioc_container> <configuration>some_config_value</configuration> </another_ioc_container>
注意:在此插件的 2.2 及更早版本中,过滤资源时使用了平台编码。根据该编码是什么,您最终可能会在过滤后得到乱码。从 2.3 版开始,此插件project.build.sourceEncoding
在过滤资源时尊重该属性。一个值得注意的例外是.xml
使用 xml 文件本身内部指定的编码过滤文件。
默认情况下,Web 资源被复制到 WAR 的根目录,如前面的示例所示。要覆盖默认目标目录,请指定目标路径。
... <configuration> <webResources> <resource> ... </resource> <resource> <directory>configurations</directory> <!-- override the destination directory for this resource --> <targetPath>WEB-INF</targetPath> <!-- enable filtering --> <filtering>true</filtering> <excludes> <exclude>**/properties</exclude> </excludes> </resource> </webResources> </configuration> ...
使用示例项目,生成的 WAR 将如下所示:
documentedproject-1.0-SNAPSHOT.war |-- META-INF | |-- MANIFEST.MF | `-- maven | `-- com.example.projects | `-- documentedproject | |-- pom.properties | `-- pom.xml |-- WEB-INF | |-- classes | | |-- com | | | `-- example | | | `-- projects | | | `-- SampleAction.class | | `-- images | | `-- sampleimage.jpg | |-- config.cfg | `-- web.xml |-- external-resource.jpg |-- image2 | `-- external-resource2.jpg |-- index.jsp `-- jsp `-- websource.jsp