文章目录
1. java agent技术简介
在JDK1.5之后,可以使用agent技术构建一个独立于应用程序的代理程序(即Agent)。可以用来协助监测、运行甚至替换其他JVM上的程序。使用它可以实现虚拟机级别的AOP功能。
2. Agent案例
2.1 最简单的Agent案例
2.1.1 代码
基础的demo可以参考:
一个最简单的javaagent demo实例
2.1.2 打包方式
注意:这种打包方式和maven的打包方式是不同的,maven的打包方式可见下文。

生成Build Artifact是在Build->Build Artifact下生成的。

2.1.3 生成jar包时,需要注意编译的JDK版本。



2.2 复杂的Agent案例
目的:AOP装饰线程池的Runnable、Callable类。
项目对应的GitHub地址
2.2.1 配置启动项
启动项的地址为生成jar的绝对地址:
-javaagent:/Users/yexuerui/Documents/veradm/agenttest/out/artifacts/agenttest_jar/agenttest.jar

2.2.2 生成jar包
使用idea去打包
因为修改的是JDK的标准库的类,而标准库的类是由bootstrap class loader类加载器加载的,而上面修改的ThreadPoolExecutor类引用了agent类的代码,所以agent的jar包需要加到boot class path上。即需要去配置MF文件中的Boot-Class-Path。
如果不修改,会出现:

但是仅仅配置Boot-Class-Path: agenttest.jar依旧javassist的类出现NoClassDefFoundError异常。
所以当使用idea进行打包时,需要如下配置MF文件:
Manifest-Version: 1.0
Class-Path: spotbugs-annotations-4.1.1.jar jsr305-3.0.2.jar javassist-
3.23.2-GA.jar
Premain-Class: com.yyy.agent.demo.agent.TtlAgent
Can-Redefine-Classes: true
Can-Set-Native-Method-Prefix: true
Boot-Class-Path: agenttest.jar javassist-3.23.2-GA.jar
Can-Retransform-Classes: true
最优的配置是将javassist-3.23.2-GA.jar打入到agenttest.jar中,可以使用下面的maven打包的方式。
使用maven去打包
- 配置MF文件,打包的时候,自动生成MF文件配置:
<build>
<plugins>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifestEntries>
<Premain-Class>com.yyy.agent.demo.agent.TtlAgent</Premain-Class>
<Boot-Class-Path>${project.artifactId}-${project.version}.jar</Boot-Class-Path>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
<Can-Set-Native-Method-Prefix>false</Can-Set-Native-Method-Prefix>
</manifestEntries>
</archive>
</configuration>
</plugin>
- 将javassist的jar包内容打入到生成的jar包中
- 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
- 对依赖的jar包进行重命名(用于类的隔离);
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>3.2.4</version>
<executions>
<execution>
<id>shade-when-package</id>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<relocations>
<relocation>
<pattern>javassist</pattern>
<shadedPattern>com.yyy.agent.demo.agent.internal.javassist</shadedPattern>
</relocation>
</relocations>
<artifactSet>
<includes>
<include>org.javassist:javassist</include>
</includes>
</artifactSet>
<shadeSourcesContent>true</shadeSourcesContent>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
- 生成jar包的命令
mvn clean install
遇到的问题:

生成jar包的时候,可能会出现这个问题,看上去是网络超时。原因是:连接的公司内网,所以不能进行下载。解决方案就是使用手机热点进行下载。
- 最终生成的jar包

本文深入探讨Java Agent技术,从概念到实践,包括如何构建代理程序,实现虚拟机级别的AOP功能,以及复杂案例如装饰线程池的Runnable、Callable类。详细介绍了不同打包方式、配置启动项,并解决常见错误。

147

被折叠的 条评论
为什么被折叠?



