Java-Agent 环境搭建 | 学习笔记

简介: 快速学习 Java-Agent 环境搭建

开发者学堂课程【分布式链路追踪 Skywalking:Java-Agent 环境搭建】学习笔记,与课程紧密连接,让用户快速学习知识。

课程地址https://developer.aliyun.com/learning/course/743/detail/13165


Java-Agent 环境搭建


内容介绍:

一、java agent 是什么

二、如何使用 java agent


一、java agent 是什么

Java agent 本质上是 java 命令的一个参数。

参数 java agent 可以用于指定一个 jar 包。使用java-agent技术可以实现stylewalking实时监控。

Jar 包的两点要求如下:

1. jar  包的 MANIFESTMF 文件必须指定 Premain-Qlass 项。

2. Premain-Class 指定的那个类必须实现 premain ()方法。方法名是固定的,当java 虚拟机启动时,在styleworking-agent.jia中执行后执行main函数,这样JVM 的特征就可以执行一些初始化的操作。


二、如何使用 java agent

首先定义一个 MANIFESTMF 文件,必须包含 Premain-Class 选项,这个选项指定了类,这个类中必须包含 premain 方法,这个方法也是java agent 的启动方法,这个方法是一个静态方法,方法逻辑由用户自己决定。然后将 premain 的类和 MANIFESTMF 文件统一进行打包,打包成一个 jar 包。最后在应用项目中使用参数 -iava agent:jar 包路径启动要代理的方法。那么此时在启动之后就会先执行 jar 包中的 premain 方法,然后再执行main方法。

接下来演示代码如何操作:

首先创建一个工程,这个工程不需要额外的,只需要最基本的代码,把它放在c盘下。

生成完第一步就是编写一个 premain 方法,这个方法有参数要求,方法名是固定的不能随意更改。添加两个参数,第一个叫angentparam参数,第二个叫 instrumentation 参数,这个参数能操作一些类的方法,提供了一些类转换的方法,在代码里打出 premain 执行,然后再把参数打进去,这是 premain 方法写完了。

代码如下:

import java.lang.instrument.Instrumentation;

public class PreMainAgent {public static void premain(string agentparam,Instrumentation inst){

System.out.println("premain执行");

system.outprintln(agentparam);

还需要编写一个 MIMIFEXT 文件,这个文件编辑起来相对麻烦,同时还需要对它进行打包,打包的时候需要对插件进行处理,最方便的方法是使用一个插件,这个插件叫做 maven-asemb.plugin 组装插件,可以把代码拷贝一下,把它拷贝到pom中。

代码如下:

<manifest>

<addClasspath>true</addClasspath></manifest>

<manifestEntries>

<Premain-Class>PreMainAgent</Premain-Class>

<Agent-Class> PreMainAgent</Agent-Class>

<Can-Redefine-Classes>true</Can-Redefine-Classes>

<Can-Retransform-Classes>true</Can-Retransform-Classes>

</manifestEntries></archive></configuration><executions>

<execution>

<id>make-assembly</id><phase>package</phase><goals>

<goal>single</goal>

</goals>

</execution>

</executions>

</plugin>

</plugins>

</build>

这个代码最重要的部分是<Premain-Class>PreMainAgent</Premain-Class>部分,需要制定 篇remain 的位置,这时把文件指定到 PreMainAgent 位置,此时当它启动时会执行premainagent 中的 premain 方法。

另外代码中添加了 jar-with-dependencies依赖,也就是说无论添加什么依赖,所有的依赖都可以打包在 jar 包里。

<Can-Retransform-Classes>true</Can-Retransform-Classes>,这样就可以自动生成 MINIFEXT 文件。

接下来来测试一下,对它进行打包,通过 pacakage 进行打包,此时 target 应该已经编译出来了这个 class 文件,同时这个 jar 包也打包完成了。

image.png

光打包还不行,打包以后还需一个测试的项目进行 agent 测试。再创建一个模块,把代码生成到C盘下面,与 agent-demo 同级,点击 finish,创建目录,user 的创建方法计较简单,因为再 main 方法中就能够执行,所以提供一个 main 方法。

接下来就可以使用 agent,首先拷贝代码,然后通过启动这个 main

方法查看他的执行位置,

image.png

现在只有 main 方法执行这一条记录,然后

把 java-agent 添加上去,在后面还可以通过添加等号添加一些参

数,继续执行 main 方法,可以看到 agent 已经呗加载

进去了,先执行premain 方法,也就是再demo中执行了 premain,

第二步再打印一个参数,最后执行 main 方法。

这个跟之前说的执行顺序是一致的:先执行 Java 中的premain方

法,再执行 main 方法。

image.png对于premain还有另外一种写法,方法拷贝一下,可以把第二个参

数值去掉,如果第一种写法的两个参数不存在,就可以打印这种,单

个参数的方法,然后打包一下。

现在是执行1,把执行1屏蔽掉进行打包后,看执行2

是否会执行,可以看到执行2也成功了。

可以看到逻辑是这样的:当两个参数的 premain 方法存在时,调用

两个参数的方法;当两个参数的 premain 方法不存在时,调用一个

参数的方法。

代码如下:

import java.lang.instrument.Instrumentation;

public class PreMainAgent {public static void premain(string agentparam,Instrumentation inst){

System.out.println("premain执行");

system.outprintln(agentparam);

{

以上就是 java agent 的简单用法,他的逻辑是,当需要执行 main

方法是,会先执行jar 包中的 premain 方法。

相关文章
|
5月前
|
存储 Java
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
Java学习笔记 List集合的定义、集合的遍历、迭代器的使用
|
2月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
2月前
|
Java 数据库连接 API
Spring 框架的介绍(Java EE 学习笔记02)
Spring是一个由Rod Johnson开发的轻量级Java SE/EE一站式开源框架,旨在解决Java EE应用中的多种问题。它采用非侵入式设计,通过IoC和AOP技术简化了Java应用的开发流程,降低了组件间的耦合度,支持事务管理和多种框架的无缝集成,极大提升了开发效率和代码质量。Spring 5引入了响应式编程等新特性,进一步增强了框架的功能性和灵活性。
55 0
|
3月前
|
分布式计算 资源调度 Hadoop
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
大数据-01-基础环境搭建 超详细 Hadoop Java 环境变量 3节点云服务器 2C4G XML 集群配置 HDFS Yarn MapRedece
103 4
|
4月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
从Java环境的搭建到实际代码的编写,从基本用法的讲解到底层原理的剖析,深度解析Java基础知识。本文是《Java学习路线》专栏的起始文章,旨在提供一套完整的Java学习路线,覆盖Java基础知识、数据库、SSM/SpringBoot等框架、Redis/MQ等中间件、设计模式、架构设计、性能调优、源码解读、核心面试题等全面的知识点,并在未来不断更新和完善,帮助Java从业者在更短的时间内成长为高级开发。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(基础篇)
|
4月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
本文是Java基础的进阶篇,对异常、集合、泛型、Java8新特性、I/O流等知识进行深入浅出的介绍,并附有对应的代码示例,重要的地方带有对性能、底层原理、源码的剖析。适合Java初学者。
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(进阶篇)
|
3月前
|
Java 数据安全/隐私保护
java学习笔记(基础习题)
java学习笔记(基础习题)
51 0
|
3月前
|
Java 程序员 开发工具
java学习笔记
java学习笔记
50 0
|
4月前
|
存储 安全 Java
Java修仙之路,十万字吐血整理全网最完整Java学习笔记(高级篇)
本文是“Java学习路线”中Java基础知识的高级篇,主要对多线程和反射进行了深入浅出的介绍,在多线程部分,详细介绍了线程的概念、生命周期、多线程的线程安全、线程通信、线程同步,并对synchronized和Lock锁;反射部分对反射的特性、功能、优缺点、适用场景等进行了介绍。
|
5月前
|
SQL druid Java
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)
68 3
Java数据库部分(MySQL+JDBC)(二、JDBC超详细学习笔记)(下)