本文的方法是针对Maven管理的Java Web工程

静态资源的过滤

在maven中,静态资源的过滤使用基本上大家都知道,只需要在<build></build>中使用resources标签即可,示例如下:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>1234567891011

在静态资源的过滤中,基本的元素有三种:

  • directory:指定资源所在的目录,这个目录的路径是相对于pom.xml文件;
  • includes:指定要包含哪些文件,其中包括inlcude子节点来指定匹配的模式;
  • excludes:指定要排除哪些文件,其中包括exclude子节点来指定匹配的模式;
  • filtering:指定哪些文件需要过滤,这个过滤的目的是为了替换其中的占位符${},其中的占位符属性在pom.xml文件中的<properties></properties>中指定;

在其中可能遇到的问题如下:

  • 当includes和excludes冲突的时候,优先采取excludes中的设定,这篇文章中详细的说明了,这篇文章从源码角度进行了分析;

字节码文件的过滤

相对于静态资源的过滤,针对字节码文件的过滤则比较生僻,尤其是在配置文件基本上都是xml或者properties的时候,如果你的工程的配置是Java Config风格的,那么就会遇到在不同的环境下加载不同的配置类的问题。不同于静态的配置文件直接使用<resources>标签(其实背后还是通过resource插件完成的),字节码的过滤需要直接使用maven-war-plugin ,实例如下:

<plugin>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-war-plugin</artifactId>
   <version>3.0.0</version>
   <configuration>
      <packagingExcludes>WEB-INF/classes/test/dao/,
         WEB-INF/classes/test/service/,
         WEB-INF/classes/config/TestConfig.class,
         WEB-INF/lib/log4j-*.jar
      </packagingExcludes>
   </configuration>
</plugin>123456789101112

从上面可以看到,该插件是通过packagingExcludes元素完成过滤的,这个元素的作用是在工程package之前, 通过一些模式来排除掉一些文件或者文件夹,如果有多个可以通过逗号“,”来分割,上述使用的例子:

  • 排除特定配置类:WEB-INF/classes/config/TestConfig.class
  • 排除特定文件夹:WEB-INF/classes/test/service/
  • 排除引用的jar包:WEB-INF/lib/log4j-*.jar

上述使用的路径是相对于war包的根路径的

另外在packagingExcludes中还可以使用Java的正则表达式,通过%regex[...]包裹即可,具体可以看官方文档 .


转载链接:https://blog.csdn.net/lmy86263/article/details/71189485?locationNum=3&fps=1