业务开发过程中,经常需要利用maven,将代码进行打包成jar包的形式在服务器上进行运行。但是在打包过程中,maven会将所有的依赖都打进包内,不管有些递归依赖是不必要的 ,虽然我们可以利用 mvn dependence:tree 命令得到所有的依赖图,再通过在pom.xml文件中进行exclusion的标签将依赖除去,但是这种方法第一需要大量的人工校验,第二不能很准确的找出不需要的依赖文件,大部分是需要依赖直觉,所以会浪费很多时间,在此情况下,准备做一个jvm级别的工具,通过对类加载进jvm的过程进行监控,得到所有需要的类的方式,从而准确的进行对jar包的压缩。
言归主题,在确定了需求以及大致思路后,在进行准备的过程中,发现了一个javaagent的东西,可以有效的完成我们的需求。
什么是javaagent呢?
顾名思义,javaagent是一个对java进行代理的东西,找到一段我觉得较准确的描述
引用
javaagent是一种能够在不影响正常编译的情况下,修改字节码。java作为一种强类型的语言,不通过编译就不能能够进行jar包的生成。而有了javaagent技术,就可以在字节码这个层面对类和方法进行修改。同时,也可以把javaagent理解成一种代码注入的方式。但是这种注入比起spring的aop更加的优美。
在我简单操作之后,对这个东西的理解就是,他是一个字节码层面的类的加强器,即可以在不改变类的情况下,附加一些我们需要增加的功能。
如何使用javaagnet呢,有两个条件,第一,实现一个premain方法,第二在打包时,明确实现premain方法的 类。
在将自定义的agent进行打包后,可以看到jar包的内容为
Manifest-Version: 1.0
Premain-Class: ClassAgent
Built-By: .
Created-By: Apache Maven 3.5.0
Build-Jdk: 1.8.0_111
即有指定preclass的类,这就可以作为javaagent的工具包了。
具体使用方法就是,在执行我们的代码是,在启动参数上添加 -javaagent:{path-to-our-agent.jar},替换进我们agent工具包的地址就行,这样我们就可以看到在执行真正代码前,先执行了我们的premain方法,这也就是为什么叫pre-main了^-^
太迟了,随便写了一个demo实验了一下
public class ClassAgent {
public static void premain(String agentOps, Instrumentation instrumentation) {
System.out.println("---------start agent-------------");
System.out.println(agentOps);
instrumentation.addTransformer(new ClassTransformer());
}
}
public class ClassTransformer implements ClassFileTransformer {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
public class ClassTransformer implements ClassFileTransformer {
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] classfileBuffer) throws IllegalClassFormatException {
System.out.println(className.replace('/','.'));
return new byte[0];
}
}
return new byte[0];
}
}
再在pom.xml文件里注册premain的class
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifestEntries>
<Premain-Class>ClassAgent</Premain-Class>
</manifestEntries>
</archive>
</configuration>
</plugin>
</plugins>
</build>
最后,将这个项目打包,并将jar包位置作为参数,传入实际执行代码的启动参数中,并启动
看到console输出
离目标前进了一小步,睡觉
- 大小: 251.8 KB
分享到:
相关推荐
代理Java包,用于生成JVM的健康的数据,jmx_prometheus_javaagent-0.12.0.jar
基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip基于Java Agent实现的自测联调Mock利器.zip...
不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马.zip不那么一样的 Java Agent 内存马...
环境JDK1.8 IDEA项目 javaagent+javassist 下载后导入即可
java 代理例子 -javaagent,premain方式实现
java服务端热更新案例-javaagent
Java agent使用大全-编辑再发
调试!!
主要介绍了javaagent的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下
JavaAgent技术的Demo,agentmain方式 采用Javaassist技术实现字节码修改,VirtualMachine技术实现运行时代码织入
在此和大家分享JADE(全称Java Agent DEvelopment Framework)一个很酷的在Java上进行Agent开发的框架。你可以用这个框架很轻易的搭建一个MAS(多智能体系统),在这些系统中,各个Agent是自治的,而且可以互相通信...
https://pan.baidu.com/s/15TPev6CpXCRIPvXCIreMzA sbnh
snmp java agent工具 ,snmp mib工具,查看snmp mib,调试snmp
JavaAgent技术的Demo,agentmain方式 采用Javaassist技术实现字节码修改,VirtualMachine技术实现运行时代码织入
JavaAgent Javassist 与 Asm JavaAgent 字节码动态编程项目
java启动参数中就有javaagent,你只需要在JAVA_OPTS中加入-javaagent:/opt/javaagent/javaagent.jar=/opt/javaagent/agent.properties就实现了方法级监控。其中=前指定的是jar包的路径,=后指定的是对agent的一些配置...
NULL 博文链接:https://shihuan830619.iteye.com/blog/2258595
NULL 博文链接:https://chenhua-1984.iteye.com/blog/1541294
2. Premain‐Class 指定的那个类必须实现 premain 方法 1. 定义一个 MANIFEST.MF 文件,必须包含 Premain‐Class
基于计算机软件开发的JAVA编程应用初探.pdf