Java agent从0到1的踩坑过程
发布日期:2022-02-14 16:09:35
浏览次数:44
分类:技术文章
本文共 2581 字,大约阅读时间需要 8 分钟。
文章目录
1. java agent技术简介
在JDK1.5之后,可以使用agent技术构建一个独立于应用程序的代理程序(即Agent)。可以用来协助监测、运行甚至替换其他JVM上的程序。使用它可以实现虚拟机级别的AOP功能。
2. Agent案例
2.1 最简单的Agent案例
2.1.1 代码
基础的demo可以参考:
2.1.2 打包方式
生成Build Artifact是在注意:这种打包方式和maven的打包方式是不同的,maven的打包方式可见下文。
Build->Build Artifact
下生成的。 2.1.3 生成jar包时,需要注意编译的JDK版本。
2.2 复杂的Agent案例
目的:AOP装饰线程池的Runnable、Callable类。
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.0Class-Path: spotbugs-annotations-4.1.1.jar jsr305-3.0.2.jar javassist- 3.23.2-GA.jarPremain-Class: com.yyy.agent.demo.agent.TtlAgentCan-Redefine-Classes: trueCan-Set-Native-Method-Prefix: trueBoot-Class-Path: agenttest.jar javassist-3.23.2-GA.jarCan-Retransform-Classes: true
最优的配置是将javassist-3.23.2-GA.jar
打入到agenttest.jar
中,可以使用下面的maven打包的方式。
使用maven去打包
- 配置MF文件,打包的时候,自动生成MF文件配置:
maven-jar-plugin 2.4 com.yyy.agent.demo.agent.TtlAgent ${project.artifactId}-${project.version}.jar true true false
- 将javassist的jar包内容打入到生成的jar包中
- 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
- 对依赖的jar包进行重命名(用于类的隔离);
maven-shade-plugin 3.2.4 shade-when-package package shade javassist com.yyy.agent.demo.agent.internal.javassist org.javassist:javassist true
- 生成jar包的命令
mvn clean install
遇到的问题:
生成jar包的时候,可能会出现这个问题,看上去是网络超时。原因是:连接的公司内网,所以不能进行下载。解决方案就是使用手机热点进行下载。
- 最终生成的jar包
3. 推荐阅读
转载地址:https://blog.csdn.net/qq_29595463/article/details/108058181 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2024年03月28日 18时37分43秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Lua(四)——变量
2019-04-27
Lua(十四)——元表
2019-04-27
Lua(十五)——协同程序
2019-04-27
Lua(十六)——文件
2019-04-27
Lua(十七)——面向对象
2019-04-27
Lua(十八)——错误处理,垃圾回收
2019-04-27
xLua(一)——介绍
2019-04-27
xLua(二)——下载
2019-04-27
xLua(三)——在C#中访问Lua代码
2019-04-27
xLua(四)——C#访问Lua的基本类型
2019-04-27
xLua(五)——C#访问Lua的table
2019-04-27
xLua(六)——C#访问Lua的function
2019-04-27
基础知识——常用单位介绍
2019-04-27
xLua(七)——Lua访问C#(一)
2019-04-27
xLua(八)——Lua访问C#(二)
2019-04-27
Unity中实现解析Json文件
2019-04-27
Unity自带Json解析库——JsonUtility
2019-04-27
Unity中使用ViedoPlayer操作视频文件
2019-04-27
C#中的的输入与输出
2019-04-27
C#中@符号的作用
2019-04-27