使用ASM 6.1动态生成Class文件,打包Fat Jar时Maven Shade插件报错求助
解决ASM动态生成Class配合Maven Shade打包的IllegalArgumentException问题
我之前也踩过ASM动态生成类配合maven-shade-plugin打包的坑,给你几个实用的排查和解决方向:
1. 升级Maven Shade插件版本
你当前使用的maven-shade-plugin:2.4.3版本比较老旧,对ASM 6.1生成的字节码可能存在兼容性问题。建议升级到较新的稳定版本(比如3.4.1),修改你的pom.xml插件配置:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin>
2. 重命名ASM依赖包避免冲突
动态生成的类可能和项目依赖中的ASM类产生命名或字节码结构冲突,通过relocate配置重命名ASM的包路径,能有效避免这类问题:
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>org.objectweb.asm</pattern> <shadedPattern>your.project.shaded.asm</shadedPattern> </relocation> </relocations> </configuration> </execution> </executions> </plugin>
记得把your.project.shaded.asm替换成你项目的实际包路径。
3. 验证ASM生成的字节码合法性
如果ASM生成的字节码不符合JVM规范,Shade插件在处理时会抛出IllegalArgumentException。你可以用ASM自带的CheckClassAdapter来验证生成的类:
// 在你的类生成逻辑中添加验证步骤 ClassWriter classWriter = new ClassWriter(ClassWriter.COMPUTE_FRAMES); // 这里是你的ASM生成代码(比如访问类、方法、字段等) // ... // 验证字节码是否合法 CheckClassAdapter.verify(classWriter, false, new PrintWriter(System.out));
运行这段代码后,控制台会输出字节码的错误信息,修复这些问题后再尝试打包。
4. 获取详细错误日志定位问题
默认的Maven日志信息不够详细,你可以添加-X参数运行打包命令,获取完整的堆栈跟踪:
mvn shade:shade -X
从详细日志里找到IllegalArgumentException的具体触发位置(比如涉及哪个类、哪个方法),能帮你更精准地定位问题根源。
内容的提问来源于stack exchange,提问作者Some Name
相关产品推荐
相关产品推荐

