首页 > 编程语言 >Java Agent入门教程

Java Agent入门教程

时间:2023-06-12 14:46:27浏览次数:80  
标签:Java agentArgs 入门教程 jar agent Agent jvm assembly

一、核心逻辑

创建一个新的项目(or 子 module),然后我们新建一个 SimpleAgent 类:

package com.raorao.text;

import java.lang.instrument.Instrumentation;

/**
 * @Description : 启动类
 * @Author : cxw
 * @Date : 2023/6/12 14:18
 * @Version : 1.0
 **/
public class MySimpleAgent {
    /**
     * jvm 参数形式启动,运行此方法
     *
     * @param agentArgs
     * @param inst
     */
    public static void premain(String agentArgs, Instrumentation inst) {
        System.out.println("premain agentArgs="+agentArgs);
    }

    /**
     * 动态 attach 方式启动,运行此方法
     *
     * @param agentArgs
     * @param inst
     */
    public static void agentmain(String agentArgs, Instrumentation inst) {
        System.out.println("agentmain agentArgs="+agentArgs);
    }
}

先简单看一下这两个方法的区别,注释上也说了

jvm 参数形式: 调用 premain 方法
attach 方式: 调用 agentmain 方法

其中 jvm 方式,也就是说要使用这个 agent 的目标应用,在启动的时候,需要指定 jvm 参数 -javaagent:xxx.jar。然后执行 main 函数之前,JVM 会先运行 -javaagent 所指定 jar 包内 Premain-Class 这个类的 premain 方法,即在主程序运行之前先启动运行agent。
当目标应用程序启动之后,动态attach的方式启动agent,这时候就可以使用 attach 方式来使用。

二、打包

上面一个简单 SimpleAgent 就把我们的 Agent 的核心功能写完了(就是这么简单),接下来需要打一个 Jar 包。通过 maven 插件,可以比较简单的输出一个合规的 java agent 包,有两种常见的使用姿势:

2.1. pom 指定配置方式
在 pom.xml 文件中,添加如下配置,请注意一下manifestEntries标签内的参数

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-assembly-plugin</artifactId>
<!--                <version>1.3</version>-->
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifestEntries>
                            <Premain-Class>com.raorao.text.MySimpleAgent</Premain-Class>
                            <Agent-Class>com.raorao.text.MySimpleAgent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>attached</goal>
                        </goals>
                        <phase>package</phase>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

然后通过 mvn assembly:assembly 命令打包,在target目录下,可以看到一个后缀为jar-with-dependencies的 jar 包,就是我们的目标:

2.2. MANIFEST.MF 配置文件方式
通过配置文件MANIFEST.MF,可能更加常见,这里也简单介绍下使用姿势

-在资源目录(Resources)下,新建目录META-INF
-在META-INF目录下,新建文件MANIFEST.MF

文件内容如下:

 请注意,最后一行要有一个空行,不能少,在 idea 中,删除最后一行时,会有错误提醒:

 然后我们的pom.xml配置,需要作出对应的修改:

 同样通过mvn assembly:assembly命令打包

三、Agent使用

agent 有了,接下来就是需要测试一下使用 agent 的使用了,上面提出了两种方式,下面分别进行说明:
jvm 参数 请注意VM options的内容为之前打包的 agent 绝对地址:

-javaagent:D:\web\agenttest\target\agen-test-1.0-SNAPSHOT-jar-with-dependencies.jar

首先新建一个 demo 项目,写一个简单的测试类:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(6条消息) Java Agent入门教程_程序员杨叔的博客-CSDN博客

 

标签:Java,agentArgs,入门教程,jar,agent,Agent,jvm,assembly
From: https://www.cnblogs.com/raorao1994/p/17474993.html

相关文章

  • Java 线程池简单使用
    privatefinalThreadPoolExecutorhandleExecutor=newThreadPoolExecutor(3,5,5000L,TimeUnit.MILLISECONDS,newLinkedBlockingQueue<>(),newThreadFactoryBuilder().setNameFormat("MsgCenterHandle-%d").build());......
  • [转]POI 解析excel报错 java.lang.NoClassDefFoundError: org/apache/poi/ss/usermode
    前几天做了一个excel上传导入功能,为了通用想同步支持xls和xlsx格式。代码编写期并没有报错,所需要的类也都有。可是应用启动完测式功能的时候报了这么一个错Causedby:java.lang.NoClassDefFoundError:org/apache/poi/ss/usermodel/Date1904Support这是为什么呢?我第一感觉是jar......
  • Java 容器都有哪些?
    Java提供了多种容器类,用于存储和操作一组对象。以下是一些常见的Java容器:List(列表):按照插入顺序维护元素的有序集合。常见的实现类有ArrayList、LinkedList、Vector等。Set(集合):存储不重复元素的无序集合。常见的实现类有HashSet、TreeSet、LinkedHashSet等。Queue(队列):按照特定规则处......
  • 【课设】JavaWeb
    课程设计 论文题目 校园o2o小卖铺(商家端) 云平台网址(管理端):150.158.50.130摘   要在高校中,学生对于小卖铺有着强烈的需求,学生希望在网络上便可以实现商品的购买,商家希望通过网络推广自己的商店。特别是在校园存在疫情的情况下,学生更加愿意通过网络对小卖铺下单,这......
  • JavaStream LIst转map
    publicstaticvoidmain(String[]args){List<TarKoc>tarKocs=newArrayList<>();tarKocs.add(newTarKoc().setId(1).setKName("aaa"));tarKocs.add(newTarKoc().setId(2).setKName("bb"));t......
  • Java XML教程_编程入门自学教程_菜鸟教程-免费教程分享
    教程简介XML是一种简单的基于文本的语言,旨在以纯文本格式存储和传输数据。它代表可扩展标记语言。JavaXML入门教程-从基本到高级概念的简单步骤了解JavaXML,其中包括概述,JavaXML解析器,DOM解析器,解析XML文档,查询XML文档,创建XML文档,修改XML文档,SAX解析器,JDOMXMLParser,StAXP......
  • 如何高质量完成java爬虫
    Java爬虫是通过Java语言编写的网络爬虫程序,用于自动化地浏览和抓取互联网上的数据,并将数据进行处理和保存。为了编写高效且不容易被检测出来的Java爬虫,通常需要掌握Java语言以及与之相关的库和框架,如Jsoup、HttpClient、Selenium等。那么如何快速完成爬虫项目?具体有哪些流程呢?......
  • Java:使用poi操作docx的word文档
    packagecom.aomen.java;importorg.apache.poi.openxml4j.exceptions.InvalidFormatException;importorg.apache.poi.util.Units;importorg.apache.poi.xwpf.usermodel.*;importorg.apache.xmlbeans.XmlCursor;importorg.openxmlformats.schemas.wordprocessingml.......
  • ABP入门教程4 - 初始化运行
    点这里进入ABP入门教程目录 编译解决方案重新生成解决方案,确保生成成功。连接数据库打开JD.CRS.Web.Host/appsettings.json,修改数据库连接设置ConnectionStrings.打开JD.CRS.Web.Host/appsettings.json,做同样修改.   迁移数据库方法一设置JD.CRS.Web.Mvc为启始项目打开工具/......
  • ABP入门教程3 - 解决方案
    点这里进入ABP入门教程目录 创建项目点这里进入ABP启动模板 如图操作,我们先生成一个基于.NETCore的MPA(多页面应用).点击"Createmyproject!"即可创建项目. 解读项目展示层(JD.CRS.Web.Mvc)提供一个用户界面,实现用户交互操作。ASP.NETCoreMVC(模型-视图-控制器)可以视为展示层......