使用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
相关推荐
野生技术架构师9 小时前
金三银四面试总结篇,汇总 Java 面试突击班后的面试小册
java·面试·职场和发展
小袁拒绝摆烂10 小时前
多表关联大平层转JSON树形结构
java·json
ja哇11 小时前
大厂面试高频八股
java·面试·职场和发展
yoyo_zzm11 小时前
Laravel6.x新特性全解析
java·spring boot·后端
Nick_zcy11 小时前
小说在线阅读网站和小说管理系统 · 功能全解析
java·后端·python·springboot·ruoyi
源码宝11 小时前
基于 SpringBoot + Vue 的医院随访系统:技术架构与功能实现
java·vue.js·spring boot·架构·源码·随访系统·随访管理
qinqinzhang12 小时前
Java 中的 IoC、AOP、MVC
java
禾叙_12 小时前
【langchain4j】结构化输出(六)
java·开发语言
饭小猿人12 小时前
Android 腾讯X5WebView如何禁止系统自带剪切板和自定义剪切板视图
android·java