1. 程式人生 > >agentmain 使用過程中的坑,看看你有沒有遇到

agentmain 使用過程中的坑,看看你有沒有遇到

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的絕對路徑配置成相對路徑:

pom中使用本地環境變數

Maven 讀取環境變數

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內部原理