当前位置:   article > 正文

Java agent从0到1的踩坑过程_jsr305.jar

jsr305.jar

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
  • 1

配置启动项

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

最优的配置是将javassist-3.23.2-GA.jar打入到agenttest.jar中,可以使用下面的maven打包的方式。

使用maven去打包

  1. 配置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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  1. 将javassist的jar包内容打入到生成的jar包中

maven-shade-plugin介绍及使用

  1. 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
  2. 对依赖的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>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  1. 生成jar包的命令
 mvn clean install
  • 1

遇到的问题:
在这里插入图片描述

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

  1. 最终生成的jar包
    在这里插入图片描述

项目对应的GitHub地址

3. 推荐阅读

调用链上下文跨线程传递

☆基于Java Instrument的Agent实现

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/878924
推荐阅读
相关标签
  

闽ICP备14008679号