执行Maven deploy时maven-resources-plugin复制application.yaml抛IllegalArgumentException
异常产生根因
- 直接触发源是
maven-resources-plugin 3.2.0版本关联的IO工具逻辑存在兼容缺陷:该版本依赖的maven-shared-utils组件,在实现带字符编码转换的过滤式文件拷贝时,直接操作NIO缓冲区设置位置参数,当搭配JDK 11及以上高版本运行时,受JDK对NIO Buffer的访问校验规则变更影响,传入的位置参数一旦不符合上层Buffer类的校验要求,就会直接抛出IllegalArgumentException,堆栈中出现的java.nio.Buffer.position方法栈帧就是这个问题的直接落点。 - 为什么删除
application.yaml后构建能正常通过:不带过滤逻辑的普通文件拷贝走的是原生IO流分支,不会触发这段有缺陷的NIO缓冲处理代码;而日志中显示file application.yaml has a filtered file extension,说明application.yaml默认被插件识别为需要走过滤逻辑的文件,刚好命中这个缺陷分支,导致拷贝流程中断。
有效解决方案
按照优先级从高到低排列:
- 第一优先级:升级
maven-resources-plugin到修复了该缺陷的3.3.1及以上版本。该版本已经重构了文件拷贝的NIO处理逻辑,从根源上消除和高版本JDK的兼容问题,直接在项目pom.xml的build段声明插件版本即可生效,示例配置:<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>3.3.1</version> </plugin> - 第二优先级:如果受环境限制暂时无法升级插件版本,可以将
application.yaml类文件排除在过滤拷贝的匹配范围外,直接走无缺陷的普通文件拷贝分支。示例pom资源配置:
注意:如果yaml文件中确实需要使用Maven的属性占位符做值替换,可以配合配置将占位符分隔符调整为<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> <includes> <!-- 原有需要做变量替换的配置文件保持过滤逻辑开启 --> <include>**/*.properties</include> </includes> </resource> <resource> <directory>src/main/resources</directory> <filtering>false</filtering> <includes> <!-- yaml/yml类文件关闭过滤,避开缺陷代码分支 --> <include>**/*.yaml</include> <include>**/*.yml</include> </includes> </resource> </resources>@格式,既避开和Spring自身${}占位符的冲突,也不需要依赖有缺陷的过滤分支实现变量替换。 - 第三优先级:强制降级插件传递依赖的
maven-shared-utils到缺陷出现前的2.4.2版本,覆盖插件自带的有问题依赖版本。该方案需要手动声明依赖覆盖规则,侵入性较强,仅作为无法调整插件版本、无法修改资源配置时的临时兜底方案。
内容的提问来源于stack exchange,提问作者Halley
相关产品推荐
相关产品推荐

