打包后的JavaAgent修复线程无法被执行

来源:互联网 发布:人工智能 传统制造业 编辑:程序博客网 时间:2024/06/08 11:52

在eclipse上直接用run as application来执行是可以成功从process 2 attach到process 1的,可是用maven把process 2的项目打包成jar包后就attch不成功了,报了如下的错误:

$ java -jar attach-0.0.1-SNAPSHOT-jar-with-all-dependencies.jar 79567956java.util.ServiceConfigurationError: com.sun.tools.attach.spi.AttachProvider: Provider sun.tools.attach.WindowsAttachProvider could not be instantiatedcom.sun.tools.attach.AttachNotSupportedException: no providers installed        at com.sun.tools.attach.VirtualMachine.attach(VirtualMachine.java:203)        at com.nathan.attach.attach.AttachAPI.main(AttachAPI.java:16)Exception in thread "main" java.lang.NullPointerException        at com.nathan.attach.attach.AttachAPI.main(AttachAPI.java:22)

查了很多资料,有说在process 2上加:

static{   System.loadLibrary("attach");}

试过不行,也有说把环境变量的path变量加上jre的bin目录:
%JAVA_HOME%/jre/bin

这里写图片描述

也试了,还是同样的报错,这不是坑爷爷么(沉思脸)

这里写图片描述


看了下网上讨论的焦点都集中在attach.dll,说是需要动态加载它才能在window上正常做attach的动作。

还有甚者说tools.jar是扥windows版本和linux版本的,两者不能互用。

那到底我遇到的是哪种情况呢,一样样来排查,先从attach.dll着手。

我看了下

%JAVA_HOME%/bin目录

发现没有attach.dll

再看了下

%JAVA_HOME%/jre/bin

居然找到attach.dll了,那有没有可能系统一直读的都是 %JAVA_HOME%/bin目录呢?

于是,我把
%JAVA_HOME%/jre/bin

下面的attach.dll 拷贝到

%JAVA_HOME%/bin

一执行,opss…成功了….

我的心波澜不惊甚至还有点想写代码…

这里写图片描述

脑袋空空,口袋空空,加油!