人生苦短,你需要maven,resource、filter、include、exclude简单说明及使用

本文详细解析Maven中resource的使用方法,包括如何正确打包资源文件到jar或war,资源文件的过滤机制,以及如何通过include和exclude指定特定文件进行打包。特别关注了在实际项目中遇到的问题,如资源文件获取失败和文件损坏的情况。

resource

resource用于打包资源文件到jar或war,打包后的文件,如果是war,则在WEB-INF/classes目录下,如果是jar,则在跟目录下。
java代码获取资源文件,一定要使用MyTest.class.getClassLoader().getResourceAsStream("my.txt");,使用getResource可能获取不到,原因不详(我在项目中遇到这个问题了),感兴趣的可以自己试下。

resource只对当前项目有效,对项目中的依赖无效,如果配置文件分散在各个模块,每个模块都需要添加resource

filter

filter是resource下的一个属性,默认为false,如果为true,则maven会对文件进行过滤,具体这个过滤有啥含义我现在也不太懂,不过记住以下两点就好:
一、filter为true的文件,maven在打包时,会用命令行的参数替换掉占位符 ${xxx}。
二、filter为true的文件,maven在打包时,会破坏xlsx等资源文件,导致文件损坏(我在项目中遇到这个问题了)。

include和exclude

include和exclude用于指定哪些资源需要打包,哪些资源文件不需要打包,两个同时配置并且有冲突时,以exclude为准。
配合filter可以达到有的过滤有的不过滤的效果。
所以经常可以看到类似下面的代码:

<!-- 这个配置意思是说/src/main/resources目录下的文件都是资源文件需要打包,但只有application*.properties需要过滤,其他都不用过滤 -->
		<resources>
			<resource>
				<directory>${basedir}/src/main/resources</directory>
				<filtering>true</filtering>
				<includes>
					<include>**/application*.properties</include>
				</includes>
			</resource>
			<resource>
				<directory>${basedir}/src/main/resources</directory>
				<excludes>
					<exclude>**/application*.properties</exclude>
				</excludes>
			</resource>
		</resources>
<think>嗯,用户问的是关于Mavenmaven-shade-plugin插件中<configuration>里的<filters>部分怎么写。我需要先回想一下这个插件的作用。记得maven-shade-plugin主要是用来打包可执行的uber-jar,把依赖项都包含进去,并且可能进行一些重命名或者资源过滤。 用户给出的例子中有<filters>和<filter>标签,可能他们需要配置资源过滤。在Shade插件中,filters通常用于指定哪些资源文件在打包时被包含或排除。每个<filter>元素可以指定一个资源模式,并决定是否包含这些资源。 首先,我应该解释<filters>的基本结构,然后说明<filter>里面需要配置什么。比如,每个<filter>可能会有<artifact>来指定某个依赖,然后使用<includes>或<excludes>来包含或排除特定文件。比如,可能需要排除某些依赖中的LICENSE文件或者不想要的配置文件。 还需要提醒用户注意,<includes>和<excludes>里的路径是相对于JAR包内的结构的。比如,如果要排除META-INF下的所有文件,可以写<exclude>META-INF/**</exclude>。另外,可能还需要提到如何指定具体的依赖项,使用groupId和artifactId,或者使用通配符。 另外,可能会涉及到是否要过滤项目自身的资源,这时候可能需要设置<includeProjectDependencies>之类的配置吗?或者是否需要结合<resource>元素?不过可能用户更关注的是如何过滤依赖项中的资源,所以需要重点讲清楚每个<filter>如何对应一个依赖,并配置包含或排除的文件。 可能还需要举一个例子,比如排除某个依赖的配置文件,或者包含特定的资源。同时,提醒用户如果多个filter存在时的处理顺序,或者是否有覆盖的情况。另外,可能需要提到如何查看最终的打包结果,确认过滤是否生效,比如检查生成的jar包中的内容。 最后,要确保用户理解配置的位置,是在plugin的<configuration>下的<filters>里,每个<filter>对应一个资源过滤规则。可能还需要提到其他相关配置,比如<transformers>,但用户当前的问题集中在<filters>,所以先专注于这部分。</think>以下是关于Maven Shade插件中`<filters>`配置的详细说明使用$$包裹独立公式): $$示例配置结构$$ ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <configuration> <filters> <!-- 每个filter定义一组资源过滤规则 --> <filter> <!-- 指定要过滤的依赖 --> <artifact>groupId:artifactId</artifact> <!-- 包含/排除资源文件 --> <includes> <include>要包含的文件路径</include> </includes> <excludes> <exclude>要排除的文件路径</exclude> </excludes> </filter> </filters> </configuration> </plugin> ``` $$核心要素解析$$ 1. **依赖定位** - `<artifact>`使用`groupId:artifactId`格式定位依赖 - 支持通配符:`*:*`(所有依赖)、`com.example:*`(指定组所有构件) 2. **路径匹配规则** - 使用Ant风格路径表达式: $$路径匹配公式\begin{cases} ? & 匹配单个字符 \\ * & 匹配0或多个字符 \\ ** & 递归匹配目录 \end{cases}$$ 3. **典型应用场景** - 排除冲突的`LICENSE`文件: ```xml <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/LICENSE</exclude> </excludes> </filter> ``` - 保留特定配置文件: ```xml <filter> <artifact>com.example:my-lib</artifact> <includes> <include>config/**</include> <include>messages/*.properties</include> </includes> </filter> ``` $$注意事项$$ - 过滤规则按声明顺序应用 - 使用`mvn package -X`可查看详细过滤过程 - 建议优先使用精确匹配,避免过度过滤 - 配合`<transformers>`处理`META-INF`合并问题 完整配置示例: ```xml <filters> <!-- 过滤所有依赖的签名文件 --> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> <!-- 保留特定库的资源 --> <filter> <artifact>org.apache.logging.log4j:log4j-core</artifact> <includes> <include>**/*.xml</include> <include>**/*.properties</include> </includes> </filter> </filters> ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值