javaagent+javassist实现故障注入遇到问题

ClassPool pool = ClassPool.getDefault(); 

CtClass ctclass = pool.get(className);

上面二行代码,在web容器下是拿不到Class对象,官方已经解释了,如下:

The default ClassPool returned by a static method ClassPool.getDefault() searches the same path that the underlying JVM (Java virtual machine) has. If a program is running on a web application server such as JBoss and Tomcat, the ClassPool object may not be able to find user classes since such a web application server uses multiple class loaders as well as the system class loader. In that case, an additional class path must be registered to the ClassPool. Suppose that pool refers to a ClassPool object:  

修改成如下代码:

                                ClassPool pool = ClassPool.getDefault(); 

                                pool.insertClassPath(new ClassClassPath(this.getClass()));

                                CtClass ctclass = pool.get(className);

然后,把自己开发的agent文件,如:myagnet.jar,把该jar放入目标系统位置/WEB-INF/lib/下面一起发布到web容器。

myagent.jar的MANIFEST.MF配置文件:

Manifest-Version: 1.0

Premain-Class: XXXXXXXXXXXXXXX.client.XXXXAgent

Can-Redefine-Classes: true

Class-Path: dubbo-2.5.3.jar javassist-3.19.0-GA.jar

//这个文件最后一行必须是空

myagent.jar依赖这二个dubbo-2.5.3.jar javassist-3.19.0-GA.jar,这二个文件必须确保在/WEB-INF/lib下面存在

如果被注入的目标系统非web环境,那么这三个文件jar(myagent.jar、dubbo-2.5.3.jar、javassist-3.19.0-GA.jar)同一个位置即可。

在目标系统配置VM启动参数,增加如下一行:

-javaagent:D:\XXX\tomcat-7.0.52\webapps\项目名\WEB-INF\lib\myagent.jar

猜你喜欢

转载自strongant.iteye.com/blog/2418577