Maven 关于打包插件与Resource中exclude的问题

本文介绍如何使用Maven的JAR插件排除特定资源文件,如log4j.xml,不让其被打包进最终的jar文件中。重点在于如何正确配置resource和exclude标签。

在写工程的时候很多资源文件会放到Maven的Resource文件夹下。像Log4j这种配置文件,打包的时候我们不能将其拷贝到jar包中。怎么办呢?使用Maven的JAR插件吧。

讲JAR插件之前先说说Resource标签。大家应该都知道这个标签使用来拷贝资源文件的。那个directory是用来配置资源文件的位置的。它是基于工程目录的,如果你不放心可以在前满加入${basedir}占位符。坑的是下面的exclude,这个时候我发现使用跟directory一样的绝对路径去排除log4j.xml没能成功。怀疑这个可能是基于directory的相对路径(没有验证过)。
资源文件赢还有个target标签,代表的是资源输出到那个目录下。注意,这个时候是相对于target文件夹了。

像下面这样,资源文件就配置好了。

<resources>
    <resource>
      <directory>src/main/resources</directory>
      <targetPath>resources</targetPath>
      <!--<excludes>-->
        <!--<exclude>log4j.xml</exclude>-->
      <!--</excludes>-->
    </resource>
</resources>

在这里我只讲怎么将文件移除。比如在${basedir}/src/main/resource下的log4j.xml文件。在插件里只需要将按如下配置即可。

我只强调我被坑的地方。那就是exclude标签。这个exclude是相对于target文件夹的。比如你刚刚配置resource的时候设置target是outResource的话,相应的,下面的exclude也应该改成outResource/log4j.xml

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>3.0.2</version>
    <configuration>
      <excludes>
        <exclude>log4j.xml</exclude>
      </excludes>
    </configuration>
</plugin>

这两个路径都是相对于target来说的,在Maven的官方文档中么有发现相关的说明(或许是我没注意)。所以在这里有必要写明一下,欢迎交流指正。

<think>根据引用[1]和引用[3],在Maven的资源配置中,`<exclude>`和`<include>`的优先级关系是:当两者冲突时,`<include>`的优先级高于`<exclude>`。但是,用户的问题是关于`maven-compiler-plugin`的,而引用中讨论的是资源插件(如`maven-resources-plugin`)的行为。因此,需要明确: 1. `maven-compiler-plugin`默认情况下,`exclude`的优先级高于`include`(资源插件不同)。 2. 用户想了解如何实现`include`优先级高于`exclude`,但之前已经给出了解决方案(通过两个执行步骤)。 然而,用户现在的问题是:“我想了解maven exclude的语法 请问maven exclude语法”。所以,需要直接回答关于exclude语法的问题。 ### Maven中的exclude语法 在Maven中,`<exclude>`元素用于指定在编译或资源处理过程中要排除的文件或目录。它支持Ant样式的通配符模式。以下是常见的语法规则: 1. **基本语法**: ```xml <exclude>相对路径/模式</exclude> ``` 2. **通配符**: - `*`:匹配零个或多个字符(不包括路径分隔符)。 - `**`:匹配零个或多个目录。 - `?`:匹配一个字符。 3. **示例**: - 排除特定文件:`<exclude>**/Test.java</exclude>` - 排除整个目录:`<exclude>**/test/**</exclude>` - 排除多个文件:使用多个`<exclude>`标签。 4. **在编译器插件中的使用**: ```xml <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.11.0</version> <configuration> <excludes> <exclude>**/generated/**/*.java</exclude> <exclude>**/test/**/*.java</exclude> </excludes> </configuration> </plugin> ``` 5. **在资源插件中的使用**(引用[3]示例): ```xml <resource> <directory>src/main/resources</directory> <excludes> <exclude>jdbc.properties</exclude> <exclude>mail.properties</exclude> </excludes> </resource> ``` ### 注意事项 - 在资源插件中,当`<include>`和`<exclude>`冲突时,`<include>`优先级更高(引用[1]和引用[3])。 - 在编译器插件中,默认情况下`<exclude>`优先级更高,但可以通过拆分执行步骤(如前所述)改变优先级。 ### 示例:排除目录下的所有Java文件 ```xml <excludes> <exclude>**/test/**/*.java</exclude> <!-- 排除test目录及其子目录下的所有Java文件 --> <exclude>**/*Test.java</exclude> <!-- 排除所有以Test结尾的Java文件 --> </excludes> ``` ### 引用说明 根据引用[3],在资源过滤配置中,可以通过多个`<resource>`块来分别处理包含和排除,例如: ```xml <resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <include>jdbc.properties</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <excludes> <exclude>jdbc.properties</exclude> </excludes> </resource> </resources> ``` 这里第一个资源块包含`jdbc.properties`并启用过滤,第二个资源块排除`jdbc.properties`(即包含其他文件)但不启用过滤[^3]。 ### 总结 - Maven的`exclude`语法基于Ant路径模式。 - 在编译器插件中,默认`exclude`优先级高于`include`。 - 在资源插件中,`include`优先级高于`exclude`(引用[1][^1]和引用[3][^3])。 §§相关问题§§ 1. Maven中如何同时使用多个排除规则? 2. 如何排除Maven项目中的隐藏文件? 3. Maven资源过滤的作用是什么? </think> ### Maven中`<exclude>`语法详解 在Maven配置中,`<exclude>`元素用于指定**不包含**在编译/打包过程中的文件或目录。它遵循Ant风格的路径匹配语法,支持通配符操作。以下是具体语法规则: --- #### 1. **基础语法结构** ```xml <excludes> <exclude>路径模式</exclude> <!-- 可定义多个exclude --> </excludes> ``` #### 2. **通配符规则** | 通配符 | 作用 | 示例 | 说明 | |--------|-----------------------|---------------------------|--------------------------| | `*` | 匹配0-n个非目录分隔符 | `*.java` | 当前目录所有Java文件 | | `**` | 匹配任意层级目录 | `**/test/**` | 所有test目录及其子目录 | | `?` | 匹配单个字符 | `File?.java` | File1.java, FileA.java等 | | `{}` | 匹配多个选项 | `{*.txt, *.properties}` | 同时匹配txt和properties文件 | #### 3. **优先级规则** - **资源插件**(如`maven-resources-plugin`): 当`<include>`和`<exclude>`冲突时,**`<include>`优先级更高**([引用1][^1], [引用3][^3]) ```xml <!-- 示例:只包含jdbc.properties但排除其他 --> <resource> <directory>src/main/resources</directory> <includes> <include>jdbc.properties</include> </includes> <excludes> <exclude>*.*</exclude> <!-- 此处的exclude无效 --> </excludes> </resource> ``` - **编译器插件**(`maven-compiler-plugin`): 默认**`<exclude>`优先级更高**,需通过[分步编译](https://github.com/xxx)实现反转 #### 4. **常用场景示例** | 需求 | 配置示例 | |--------------------------|---------------------------------------------| | 排除所有测试文件 | `<exclude>**/test/**/*.java</exclude>` | | 排除指定包 | `<exclude>com/example/temp/**</exclude>` | | 排除多个文件类型 | `<exclude>{*.log, *.tmp}</exclude>` | | 排除隐藏文件(如.开头的)| `<exclude>.**</exclude>` | #### 5. **路径基准点** - **编译插件**:相对于`src/main/java`或`src/test/java` - **资源插件**:相对于`src/main/resources`或`src/test/resources` - **绝对路径**:以`/`开头(不推荐),如`/config/secret.properties` --- ### 验证排除效果 使用Maven调试模式检查: ```bash mvn clean package -X | grep -E "Excluding|Including" ``` 输出示例: ``` [DEBUG] Excluding: **/test/**/*.java [DEBUG] Including: jdbc.properties # include优先级示例 ``` > ⚠️ **重要提示**:不同插件优先级规则不同,资源插件默认include优先[^1][^3],编译器插件默认exclude优先。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值