java的attach机制,可以无侵入的动态加载一个agent jar而不需要目标应用进行任何预先配置
最近在使用实现一个动态诊断调试功能时,使用到了attach机制,在每个服务器上部署一个诊断服务,由诊断服务去attach目标应用,调用VirtualMachine.attach(pid) 方法。
在IDE上启动并调用attach方法没有任何问题,但是转到测试环境上就出现了问题:
Caused by: java.lang.NoClassDefFoundError: com/sun/tools/attach/VirtualMachine
at com.huoli.mj.diagnose.attach.AttachEntrance.attach(AttachEntrance.java:60) ~[classes!/:?]
at com.huoli.mj.diagnose.controller.AttachController.attachByPid(AttachController.java:85) ~[classes!/:?]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_131]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_131]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_131]
at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_131]
经过查找资料,找到解决方法:需要在发起attach的应用启动时加入一段参数
-Xbootclasspath/a:/usr/jdk1.8.0_121/lib/tools.jar