(2020年1月7日 08:29:49)

背景

Java agent经常用于APM等功能,例如skywalking全链路跟踪工具、代码覆盖率统计等。Java agent的使用特点是一点都不用入侵原项目的代码。

假设现在有一个java项目,已经达成了jar包,可以直接jar -jar xxx.jar跑起来了。现在有一个功能,例如全链路跟踪或者代码覆盖率统计,以java agent的形式提供,一般也是一个jar包,那么启动方式是:

java -javaagent:agent.jar -jar xxx.jar

java agent可以有多个。可以看出,这样的形式很容易和容器方式结合。只需要我把Java容器中的java命令,替换成一个shell,名称也叫java,当执行java -jar xxx.jar时,替换成java -javaagent:agent.jar -jar xxx.jar即可。

这个方式可以很容易地给java镜像附加功能,例如原来的Dockerfile是FROM官方的jdk,现在只要FROM我提供的镜像,就可以具备全链路跟踪功能了。

使用Spring Starter实现类似Agent效果

Spring starter有个特点,只要把starter的jar包丢到spring boot打包的BOOT-INF\lib目录下即可生效,同时,配置项部分,除了在application.yaml文件写之外,也可以在环境变量中设置。

因此,就可以通过这两个方式实现类似Agent的效果:

  1. maven引入环境,转变为直接加入到jar包中的BOOT-INF\lib目录下
  2. application配置部分可以转换成环境变量的形式

第2个很好弄,第一个的做法是:

假设目标的jar包叫demo.jar
现在要把若干个 a.jar b.jar 放到demo.jar下的demo.jar的BOOT-INF\lib\下
步骤:

  1. 在demo.jar的同目录下创建BOOT-INF\lib\目录
  2. 把这几个jar包复制到BOOT-INF\lib\目录下
  3. 在demo.jar目录下执行:jar u0f demo.jar BOOT-INF/lib/*

唯一的一个问题是要注意拷贝进去的jar包和目标项目的jar包的冲突问题,毕竟不是通过maven管理。

文档更新时间: 2020-04-21 08:35   作者:nick