Java插桩代理实例化ClassFileTransformer时遇NoClassDefFoundError
问题原因及解决方案
核心原因
报错NoClassDefFoundError: javassist/NotFoundException的本质是你的代理jar包中未包含javassist第三方依赖的字节码文件。虽然你已经将代理类MyInstrumentationAgent和转换器类AtmTransformer打包进jar,但javassist作为外部依赖,默认构建工具(Maven/Gradle)不会自动将其合并到代理jar中。当JVM加载代理的premain方法时,实例化AtmTransformer需要用到javassist的类,却找不到对应的class文件,因此抛出异常。
解决步骤
1. 确认jar内容(可选但建议)
执行以下命令检查代理jar是否包含javassist类:
jar tf core-java-jvm-0.0.1-SNAPSHOT-agent.jar
如果输出中没有javassist/开头的路径,说明确实缺少依赖。
2. 修改构建配置,打包第三方依赖
根据你使用的构建工具,配置插件将javassist合并到代理jar中:
Maven 配置
使用maven-shade-plugin插件,在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> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Premain-Class>你的包路径.MyInstrumentationAgent</Premain-Class> <Can-Redefine-Classes>true</Can-Redefine-Classes> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
执行mvn package后,target目录下生成的shade jar会包含所有依赖类。
Gradle 配置
使用shadow插件,在build.gradle中添加:
plugins { id 'com.github.johnrengelman.shadow' version '8.1.1' } shadowJar { manifest { attributes 'Premain-Class': '你的包路径.MyInstrumentationAgent', 'Can-Redefine-Classes': 'true' } }
执行./gradlew shadowJar,生成的shadow jar会包含javassist依赖。
3. 重新运行命令
使用打包完成的代理jar(注意Maven的shade jar、Gradle的shadow jar可能和普通jar文件名有差异),执行原命令即可。
内容的提问来源于stack exchange,提问作者Kolisetty Raghavendra
相关产品推荐
相关产品推荐

