agentmain 使用過程中的坑,看看你有沒有遇到
阿新 • • 發佈:2019-01-05
com.sun.tools.attach.AttachNotSupportedException: no providers installed
我出現這個報錯,是因為我引的包有問題,本地裝了jdk的話,可以這樣引用tools.jar
<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.5.0</version> <scope>system</scope> <systemPath>D:/Program Files/Java/jdk1.8.0_192/lib/tools.jar</systemPath> </dependency>
systemPath標籤用來指定本地的tools.jar位置
可以把tools.jar的絕對路徑配置成相對路徑:
Eclipse maven工程 Missing artifact com.sun:tools:jar:1.7.0:system 解決方法
修改後:
<dependency> <groupId>com.sun</groupId> <artifactId>tools</artifactId> <version>1.5.0</version> <scope>system</scope> <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath> </dependency>
com.sun.tools.attach.AgentInitializationException: Agent JAR loaded but agent failed to initialize
loadAgent時報錯了:
然後看了下業務執行緒的後臺日誌:
adding retransformable transformers is not supported in this environment
看這個樣子是不支援,我一下就想到一個配置
在META-INF/MANIFEST.MF檔案中:
Manifest-Version: 1.0 Agent-Class: com.umbrella.robot.agent.AgentMainTraceAgent Can-Redefine-Classes: true
最後加上一行
Can-Retransform-Classes: true
修改後:
Manifest-Version: 1.0
Agent-Class: com.umbrella.robot.agent.AgentMainTraceAgent
Can-Redefine-Classes: true
Can-Retransform-Classes: true
可執行的原始碼都已經提交在https://gitee.com/jinxin.70/javaagentparent。
總結:
所謂的坑,其實大都是因為對使用的工具不熟悉導致的,比如錯誤的配置,或者沒有配置某些配置。說白了,其實是不夠熟悉。
簡言之,沒有遵守工具的使用規範。
每一種工具都是用來解決某些問題的,有它自己擅長的領域,反之,有它不適合的領域。
覺得吧,通過故意試錯,跟原始碼,應該是最快的熟悉的過程,當然這種也不是絕對的,有時間再扯。
通過對異常程式碼的跟蹤,對agent的原始碼更熟悉了,後面再寫一篇原始碼解析的文章,記錄一下agent內部原理