如何编写一个javaAgent jar工具包超详细教程

介绍

Java Agent技术

Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让Java程序
运行其中的代码。
在这里插入图片描述
在这里插入图片描述

Java Agent技术的两种模式

Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码,执行方式有两种:
⚫ 静态加载模式
⚫ 动态加载模式

Java Agent技术的两种模式 - 静态加载模式

静态加载模式可以在程序启动的一开始就执行我们需要执行的代码,适合用APM等性能监测系统从一开始就监控程序
的执行性能。静态加载模式需要在Java Agent的项目中编写一个premain的方法,并打包成jar包。
在这里插入图片描述
接下来使用以下命令启动Java程序,此时Java虚拟机将会加载agent中的代码并执行
在这里插入图片描述
premain方法会在主线程中执行:

在这里插入图片描述

Java Agent技术的两种模式 – 动态加载模式

动态加载模式可以随时让java agent代码执行,适用于Arthas等诊断系统。动态加载模式需要在Java Agent的项目中编
写一个agentmain的方法,并打包成jar包
在这里插入图片描述
接下来使用以下代码就可以让java agent代码在指定的java进程中执行了。
在这里插入图片描述
agentmain方法会在独立线程中执行:
在这里插入图片描述

搭建java agent静态加载模式的环境

步骤:

1、创建maven项目,添加maven-assembly-plugin插件,此插件可以打包出java agent的jar包。
2、编写类和premain方法,premain方法中打印一行信息。
3、编写MANIFEST.MF文件,此文件主要用于描述java agent的配置属性,比如使用哪一个类的
premain方法。
4、使用maven-assembly-plugin进行打包。
5、创建spring boot应用,并静态加载上一步打包完的java agent。

步骤1-4
代码(使用jdk17编辑):
目录结构:
在这里插入图片描述

maven 项目 pom.xml 文件(关注代码点插件位置)

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>itheima-agent</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
<build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><!--将所有依赖都打入同一个jar包中--><descriptorRefs><descriptorRef>jar-with-dependencies</descriptorRef></descriptorRefs><!--指定java agent相关配置文件--><archive><manifestFile>src/main/resources/MANIFEST.MF</manifestFile></archive></configuration></plugin></plugins>
</build></project>

AgenMain.java

package com.zss.javaagent;import java.lang.instrument.Instrumentation;public class AgenMain {// premain方法public static void premain(String agentArgs, Instrumentation inst){System.out.println("【remain执行了】");}// premain方法public static void agentmain(String agentArgs, Instrumentation inst){System.out.println("【agentmain执行了】");}
}

MANIFEST.MF

Manifest-Version: 1.0
Premain-Class: com.zss.javaagent.AgenMain
Agent-Class: com.zss.javaagent.AgenMain
Can-Redefine-Classes: true
Can-Retransform-Classes: true
Can-Set-Native-Method-Prefix: true

进行打包在这里插入图片描述
步骤5:
创建springboot项目在这里插入图片描述

JavaAgentTestController.java

package com.example.testdemo.controller;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;/*** java -jar -javaagent:D:/jvm/itheima-jvm-java-agent-jar-with-dependencies.jar  .\spring-boot-demo-0.0.1-SNAPSHOT.jar*/
@RestController
@Controller
public class JavaAgentTestController {@GetMapping("/test1")public String test1(String name) {return "test1";}
}

TestdemoApplication.java

package com.example.testdemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;import java.nio.ByteBuffer;@SpringBootApplication
public class TestdemoApplication {public static void main(String[] args) {System.out.println("main方法执行了...");SpringApplication.run(TestdemoApplication.class, args);}}

pom文件中我只添加了这个依赖

  <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

打包操作在这里插入图片描述
启动jar包
在这里插入图片描述

java -jar .\testdemo-0.0.1-SNAPSHOT.jar

此时日志只显示main方法执行了…
退出程序 Ctrl+c
如何启动jar包之前启动agent连接到jar包呢(需要再通过java agent命令将jar包引入进来)
右键复制刚才agent jar包的绝对路径
在这里插入图片描述
在这里插入图片描述
可以发现已经打印出了agent包里面写的方法了
在这里插入图片描述
命令:

java -jar -javaagent:E:\IEDA_DEMO\Study\jvm\javaagent\itheima-agent\target\itheima-agent-1.0-SNAPSHOT-jar-with-dependencies.jar  .\testdemo-0.0.1-SNAPSHOT.jar

上面是操作agent静态加载到jar包当中,下面我们来看看动态加载

搭建java agent动态加载模式的环境

步骤:

1、创建maven项目,添加maven-assembly-plugin插件,此插件可以打包出java agent的jar包。
2、编写类和agentmain方法, agentmain方法中打印一行信息。
3、编写MANIFEST.MF文件,此文件主要用于描述java agent的配置属性,比如使用哪一个类的
agentmain方法。
4、使用maven-assembly-plugin进行打包。
5、编写main方法,动态连接到运行中的java程序。

首先刚才的启动springboot项目
在这里插入图片描述
打开cmd 使用jps 插看当前springboot程序的进程ID记录下来
在这里插入图片描述
进程ID为:28712

在这里插入图片描述
新建一个类为:AttachMain.java 将刚才查看的进程ID复制到
下面这段代码里,另一个需要填写的则是agent jar包的绝对路径

package com.zss.javaagent;import com.sun.tools.attach.AgentInitializationException;
import com.sun.tools.attach.AgentLoadException;
import com.sun.tools.attach.AttachNotSupportedException;
import com.sun.tools.attach.VirtualMachine;import java.io.IOException;public class AttachMain {public static void main(String[] args) throws IOException, AttachNotSupportedException, AgentLoadException, AgentInitializationException {//获取进程虚拟机对象  VirtualMachine attach = VirtualMachine.attach("28712");// 执行 java agent 里面的agentmain 方法(所以需要找到jar包的路径)attach.loadAgent("E:\\IEDA_DEMO\\Study\\jvm\\javaagent\\itheima-agent\\target\\itheima-agent-1.0-SNAPSHOT-jar-with-dependencies.jar");}
}

执行下main方法试试
这个项目扫描都没有输出(因为这个链接的进程是隔壁springboot项目可以去隔壁看看)
在这里插入图片描述

在这里插入图片描述

执行五次看看
在这里插入图片描述

是不是有点arthas连接已运行的程序并执行代码的味道了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/308070.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring boot:3.X + Security OAuth2 自定义登录页面、登出后跳转到登录页

本文描述了基于 Spring Oauth2 的 code 模式&#xff0c;实现登陆同时授权、自定义登录界面、登出页面的功能。 1.Maven依赖&#xff1a; <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactI…

如何在 NAS 上安装 ONLYOFFICE 文档?

文章作者&#xff1a;ajun 导览 ONLYOFFICE 文档 是一款开源办公套件&#xff0c;其是包含文本文档、电子表格、演示文稿、表单、PDF 查看器和转换工具的协作性编辑工具。它高度兼容微软 Office 格式&#xff0c;包括 .docx、.xlsx 、.pptx 、pdf等文件格式&#xff0c;并支持…

55.网游逆向分析与插件开发-游戏增加自动化助手接口-自动药水设定功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一个内容&#xff1a;项目需求与需求拆解-CSDN博客 之前在找到过一个虚函数&#xff0c;每个按钮的都有一个实现机制&#xff0c;参考这里游戏结束过程的逆向分析 实际上找起来会不会用上不知道&#xff0c;接下来开始逆…

抬头举手阅读YOLOV8NANO

首先用YOLOV8NANO得到PT模型&#xff0c;转换成ONNX,OPENCV调用&#xff0c;PYTHON,C,ANDROID都可以举手写字阅读YOLOV8NANO

Kafka:本地设置

这是设置 Kafka 将数据从 Elasticsearch 发布到 Kafka 主题的三部分系列的第一部分;该主题将被 Neo4j 使用。第一部分帮助您在本地设置 Kafka。第二部分将讨论如何设置Elasticsearch将数据发布到Kafka主题。最后 将详细介绍如何使用连接器订阅主题并使用数据。 Kafka Kafka 是…

Javaweb小案例-基于SpringBoot+Vue实现的Timo商城

前言 Timo商城是基于Springbootvue的web商城系统&#xff0c;包含了商城的后台管理系统手机端微信小程序端 底层采用web-flash作为底层基础框架搭建 基本功能包含一下模块基础模块 部门管理用户管理角色管理菜单管理权限分配参数管理数据字典管理定时任务管理操作日志登录日志…

3.云原生之kubesphere运维

文章目录 k8s节点状态介绍配置宿主机使用k8s内部域名使用KubeKey 升级kubesphere使用KubeKey添加节点使用KubeKey下架节点使用k8s命令添加新节点k8s集群备份与恢复环境准备备份与还原在集群A和B中安装Velero集群A备份操作集群B还原备份操作 注意&#xff1a;所有节点运维操作前…

钡铼技术集IO数据采集可编程逻辑控制PLC无线4G环保物联网关

背景 数据采集传输对于环保企业进行分析和决策是十分重要的&#xff0c;而实时数据采集更能提升环保生产的执行力度&#xff0c;从而采取到更加及时高效的措施。因此实时数据采集RTU成为环保企业的必备产品之一。 产品介绍 在推进环保行业物联网升级过程中&#xff0c;环保RTU在…

2023年高级软考系统架构师考题参考

对于一些有实践经验的同学来说&#xff0c;感觉不难&#xff0c;但是落笔到纸面上&#xff0c;就差强人意了&#xff0c;平时这方面要多练习&#xff0c;所想所思要落到纸面上&#xff0c;或者表达清晰让别人听懂&#xff0c;不仅是工作中的一个基本素质&#xff0c;也是个非常…

Eureka注册

一、Eureka的作用 Eureka是一个服务注册与发现的工具&#xff0c;主要用于微服务架构中的服务发现和负载均衡。其主要作用包括&#xff1a; 服务提供者将自己注册到Eureka Server上&#xff0c;包括服务的地址和端口等信息。服务消费者从Eureka Server上获取服务提供者的地址…

云计算:OpenStack 配置云主机实例的存储挂载并实现外网互通

目录 一、实验 1. 环境 2.配置存储挂载 3.云主机实例连接外部网络&#xff08;SNAT&#xff09; 4.外部网络连接云主机实例&#xff08;DNAT&#xff09; 二、问题 1.云主机 ping 不通外部网络 2.nova list 查看云主机列表报错 3.nova list 与 virsh list --all有何区…

cdn引入React以及React-dom—数组遍历渲染时setExtraStackFrame报错

在引入react官网提供的cdn后&#xff0c;部分静态页面没有问题&#xff0c;但是使用到 一下循环的页面则会报错。 const devReactCdn [https://unpkg.com/react18/umd/react.development.js,https://unpkg.com/react-dom18/umd/react-dom.development.js, ]; const prodReact…