使用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
相关推荐
程序员弘羽4 分钟前
C++ 第四阶段 内存管理 - 第二节:避免内存泄漏的技巧
java·jvm·c++
旷世奇才李先生8 分钟前
Tomcat 安装使用教程
java·tomcat
勤奋的知更鸟22 分钟前
Java 编程之策略模式详解
java·设计模式·策略模式
qq_49244844624 分钟前
Java 访问HTTP,信任所有证书,解决SSL报错问题
java·http·ssl
爱上语文27 分钟前
Redis基础(4):Set类型和SortedSet类型
java·数据库·redis·后端
lifallen41 分钟前
Paimon vs. HBase:全链路开销对比
java·大数据·数据结构·数据库·算法·flink·hbase
深栈解码1 小时前
JMM深度解析(三) volatile实现机制详解
java·后端
liujing102329292 小时前
Day04_刷题niuke20250703
java·开发语言·算法
Brookty2 小时前
【MySQL】JDBC编程
java·数据库·后端·学习·mysql·jdbc
能工智人小辰2 小时前
二刷 苍穹外卖day10(含bug修改)
java·开发语言