使用Maven打包javaagent.jar

1、简介

javaagent 是 Java1.5 之后引入的新特性,其主要作用是在class被加载之前对其拦截,以插入我们的字节码。

java1.5 之前使用的是JVMTI(jvm tool interface)技术来实现对class的拦截,不过这个是用 C++ 编写的,比如 debug 功能就是用这个技术实现的。

2、jar包

常见的jar包分为 可运行jarjavaagent.jar ,它们的主要区别如下:

Executable Jar Javaagent Jar
入口方法 main premain
打包参数 Main-Class Premain-Class
启动方式 java -jar xxx.jar -javaagent:xxx.jar=dddd
是否可启动

3、可运行 jar 包

入口方法

复制代码
package com.ybw;
public class TestMain {
      // 这个是我们经常写的
      public static void main(String[] args) {
            System.out.println("hello main");
      }
}

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>com.ybw</groupId>
    <artifactId>test-main</artifactId>
    <version>1.0.0</version>

    <properties>
        <maven.compiler.source>21</maven.compiler.source>
        <maven.compiler.target>21</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <archive>
                        <!--指定 Main-Class 来指定可运行 jar 的主类 -->
                        <manifest>
                            <mainClass>com.ybw.TestMain</mainClass>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

打包jar

复制代码
mvn package

打包后会生成 target文件,并且生成 jar 包。

4、javaagent.jar

入口方法

复制代码
package com.ybw;

import java.lang.instrument.Instrumentation;

public class TestAgent {
    
    public static void premain(String arg, Instrumentation instrumentation) {
        System.out.println("javaagent arg=" + arg);
    }
}

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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ybw</groupId>
    <artifactId>agent-demo</artifactId>
    <version>1.0.0</version>
    <name>agent-demo</name>
    <description>agent-demo</description>
    <properties>
        <java.version>21</java.version>
    </properties>
    <dependencies>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.4.2</version>
                <configuration>
                    <archive>
                        <!--方法一:MANIFEST.MF 配置文件-->
                        <!--<manifestFile>src/main/resources/META-INF/MANIFEST.MF</manifestFile>-->
                        <!--方法二: pom 指定配置-->
                        <manifestEntries>
                            <Premain-Class>com.ybw.TestAgent</Premain-Class>
                        </manifestEntries>

                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

打包jar

复制代码
mvn package

打包后会生成 target文件,并且生成 jar 包。

5、执行

两个项目执行了 package 之后,把 target\agent-demo-1.0.0.jar 和 **target\**test-main-1.0.0.jar移动到同一个文件夹下。然后执行命令

复制代码
$ c:/jdk21/bin/java  -javaagent:agent-demo-1.0.0.jar=test  -jar test-main-1.0.0.jar
javaagent arg=test
hello main
相关推荐
凉年技术几秒前
Java 实现企业微信扫码登录
java·企业微信
狂奔小菜鸡1 小时前
Day41 | Java中的锁分类
java·后端·java ee
hooknum1 小时前
学习记录:基于JWT简单实现登录认证功能-demo
java
程序员Terry2 小时前
同事被深拷贝坑了3小时,我教他原型模式的正确打开方式
java·设计模式
NE_STOP2 小时前
MyBatis-缓存与注解式开发
java
码路飞2 小时前
不装 OpenClaw,我用 30 行 Python 搞了个 QQ AI 机器人
java
Re_zero2 小时前
以为用了 try-with-resources 就稳了?这三个底层漏洞让TCP双向通讯直接卡死
java·后端
SimonKing2 小时前
Fiddler抓包完全指南:从安装配置到抓包,一文讲透
java·后端·程序员
磊磊落落4 小时前
如何将 Spring Statemachine 作为一个轻量级工作流引擎来使用?
java