赞
踩
在JDK1.5之后,可以使用agent技术构建一个独立于应用程序的代理程序(即Agent)。可以用来协助监测、运行甚至替换其他JVM上的程序。使用它可以实现虚拟机级别的AOP功能。
基础的demo可以参考:
一个最简单的javaagent demo实例
注意:这种打包方式和maven的打包方式是不同的,maven的打包方式可见下文。
生成Build Artifact是在Build->Build Artifact
下生成的。
目的:AOP装饰线程池的Runnable、Callable类。
项目对应的GitHub地址
启动项的地址为生成jar的绝对地址:
-javaagent:/Users/yexuerui/Documents/veradm/agenttest/out/artifacts/agenttest_jar/agenttest.jar
使用idea去打包
因为修改的是JDK的标准库的类,而标准库的类是由bootstrap class loader
类加载器加载的,而上面修改的ThreadPoolExecutor
类引用了agent类的代码,所以agent的jar包需要加到boot class path
上。即需要去配置MF
文件中的Boot-Class-Path
。
如果不修改,会出现:
但是仅仅配置Boot-Class-Path: agenttest.jar
依旧javassist
的类出现NoClassDefFoundError
异常。
所以当使用idea进行打包时,需要如下配置MF文件:
Manifest-Version: 1.0
Class-Path: spotbugs-annotations-4.1.1.jar jsr305-3.0.2.jar javassist-
3.23.2-GA.jar
Premain-Class: com.yyy.agent.demo.agent.TtlAgent
Can-Redefine-Classes: true
Can-Set-Native-Method-Prefix: true
Boot-Class-Path: agenttest.jar javassist-3.23.2-GA.jar
Can-Retransform-Classes: true
最优的配置是将javassist-3.23.2-GA.jar
打入到agenttest.jar
中,可以使用下面的maven打包的方式。
使用maven去打包
<build> <plugins> <plugin> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifestEntries> <Premain-Class>com.yyy.agent.demo.agent.TtlAgent</Premain-Class> <Boot-Class-Path>${project.artifactId}-${project.version}.jar</Boot-Class-Path> <Can-Redefine-Classes>true</Can-Redefine-Classes> <Can-Retransform-Classes>true</Can-Retransform-Classes> <Can-Set-Native-Method-Prefix>false</Can-Set-Native-Method-Prefix> </manifestEntries> </archive> </configuration> </plugin>
- 将依赖的jar包打包到当前jar包(常规打包是不会将所依赖jar包打进来的);
- 对依赖的jar包进行重命名(用于类的隔离);
<plugin> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <id>shade-when-package</id> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <relocations> <relocation> <pattern>javassist</pattern> <shadedPattern>com.yyy.agent.demo.agent.internal.javassist</shadedPattern> </relocation> </relocations> <artifactSet> <includes> <include>org.javassist:javassist</include> </includes> </artifactSet> <shadeSourcesContent>true</shadeSourcesContent> </configuration> </execution> </executions> </plugin> </plugins> </build>
mvn clean install
遇到的问题:
生成jar包的时候,可能会出现这个问题,看上去是网络超时。原因是:连接的公司内网,所以不能进行下载。解决方案就是使用手机热点进行下载。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。