使用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
相关推荐
万法若空2 小时前
【算法-查找】查找算法
java·数据结构·算法
HZZD_HZZD4 小时前
DL/T 645-2026新国标深度解读与智能电表协议适配实战:从帧结构变化到Java采集器升级的全链路改造方案
java·开发语言
山登绝顶我为峰 3(^v^)36 小时前
C/C++ 交叉编译方法
java·c语言·c++
一叶飘零_sweeeet7 小时前
Codex 与 Claude Code 深度拆解:两代 AI 编程智能体的技术本质与 Java 实战指南
java·ai·codex·claude code
Listen·Rain7 小时前
提示词和提示词模板
java·人工智能·spring boot
wuqingshun3141597 小时前
重写equals而不重写hashCode,会出什么问题?
java·开发语言
我今晚不熬夜8 小时前
Java语言实现Modbus协议通过用串口读取数据(以RTU为例)
java·网络协议
小锋java12348 小时前
Maven 4 要来了:15 年后,Java 构建工具迎来"彻底重构"
java·maven
卓怡学长9 小时前
w269基于spring boot + vue 候鸟监测数据管理系统
java·数据库·spring boot·spring·intellij-idea