实现:
在spring-boot前提下,使用maven,需要做的是
1.在pom文件下引入以下两个插件
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.1.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
</manifest>
<manifestEntries>
<Agent-Class>xxx.MyAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifestEntries>
<Premain-Class>xxx.MyAgent</Premain-Class>
<Agent-Class>xxx.MyAgent</Agent-Class>
<Can-Redefine-Classes>true</Can-Redefine-Classes>
<Can-Retransform-Classes>true</Can-Retransform-Classes>
</manifestEntries>
</archive>
</configuration>
<executions>
<execution>
<goals>
<goal>attached</goal>
</goals>
<phase>package</phase>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.实现xxx.MyAgent,里面需要一个premain方法
public class MyAgent {
public static void premain(String agentArgs, Instrumentation instrumentation) {
System.out.println("代码植入成功");
}
}
3.打包
4.使用
VM参数中添加
-javaagent:全路径/xxx-with-dependencies.jar -javaagent:maven仓库路径/org/aspectj/aspectjweaver/1.9.7/aspectjweaver-1.9.7.jar
ps:遇到的问题和解决
1.jeccg-boot框架在使用时,植入的代码中如果使用了spring,会提示组件不存在
解决:需要在启动类上增加两个注解
2.jeccg-boot在线表单对接使用代码植入的功能
解决思路:首先,在线表单实现java增强,指定某个类作为实现类看截图👇
最重要的,植入代码里面通过切面编程,指定类作为入口,从而做到对方法的切面植入,在切面中实现需要植入的代码
@Aspect
@Component
public class MyAspect {
//这里的ArchivesSXJC指定了监听的类,(java.util.List,String)是参数列表可以自定义,也可以写(..)表示不限制
@Pointcut("execution(* *..ArchivesSXJC.*(java.util.List,String))")
public void pointcut(){
}
@Before("pointcut()")
public void before() {
System.out.println("before()");
}
@After("pointcut()")
public void after(){
System.out.println("after()");
}
@AfterReturning(value = "pointcut()",returning = "o")
public Object afterReturning(JoinPoint jp, Object o){
System.out.println("afterReturning()");
System.out.println(o);
System.out.println(jp);
return o;
}
}
( 仅为思路,项目未实践)