所有 Maven 项目的默认资源目录都src/main/resources将target/classes在WEB-INF/classesWAR 中结束。目录结构将在此过程中保留。
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.jspexternal-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.propinterpolated_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