`
strongant
  • 浏览: 65068 次
  • 性别: Icon_minigender_1
  • 来自: IT
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics