使用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
相关推荐
一只淡水鱼66几秒前
【Spring】Controller层常用注解的介绍和使用
java·后端·spring
Cachel wood11 分钟前
Vue.js前端框架教程2:Vue路由和状态管理库Pinia
java·linux·服务器·前端·vue.js·前端框架·github
小叶子来了啊13 分钟前
day4:tomcat—maven-jdk
java·tomcat·maven
北辰浮光19 分钟前
[maven]使用spring
java·后端·spring
一直学习永不止步19 分钟前
LeetCode题练习与总结:验证 IP 地址--468
java·数据结构·tcp/ip·算法·leetcode·职场和发展·字符串
计算机毕设定制辅导-无忧学长23 分钟前
在线预约陪诊小程序
java·spring boot·微信小程序
Java学长-kirito1 小时前
springboot/ssm租车管理系统Java代码编写web项目在线汽车租赁平台源码
java·spring boot·汽车
蓝影铁哥1 小时前
Linux实操篇-远程登录/Vim/开机重启
java·linux·运维·spring boot·spring·vim
技术思考者1 小时前
Java设计模式实战:策略模式、工厂模式、模板模式组合使用
java·设计模式·策略模式
计算机毕设定制辅导-无忧学长1 小时前
餐饮喜好及健康饮食推荐小程序
java·vue.js·spring boot