如何为Docker中运行的Spring Boot应用启用加载时织入?
Spring Boot Docker环境下开启加载时织入(LTW)的配置方法
一、先搞定依赖配置
Maven项目
在pom.xml里加上AspectJ和Spring相关的依赖:
<dependencies> <!-- AspectJ织入器,LTW核心依赖 --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.21</version> <!-- 用最新稳定版即可 --> </dependency> <!-- Spring自带的切面支持 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <scope>runtime</scope> </dependency> <!-- Spring Instrumentation(可选,想用Spring代理的话加) --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-instrument</artifactId> <scope>runtime</scope> </dependency> </dependencies>
Gradle项目
在build.gradle里加依赖:
dependencies { // AspectJ织入器 runtimeOnly 'org.aspectj:aspectjweaver:1.9.21' // Spring切面支持 runtimeOnly 'org.springframework:spring-aspects' // Spring Instrumentation(可选) runtimeOnly 'org.springframework:spring-instrument' }
二、开启Spring的LTW支持
用Java配置的话,写个简单的配置类:
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.EnableLoadTimeWeaving; @Configuration @EnableLoadTimeWeaving(aspectjWeaving = EnableLoadTimeWeaving.AspectJWeaving.ENABLED) public class LTWConfig { }
要是用XML配置,就加这段:
<context:load-time-weaver aspectj-weaving="on"/>
三、修改Docker相关配置
LTW需要在JVM启动时加载织入器代理,所以得把aspectjweaver的jar包放进容器,还要调整启动命令。
第一步:让构建脚本把织入器jar复制到构建目录
Maven项目
在pom.xml的build节点里加个插件,把aspectjweaver复制到target目录:
<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-aspectj-weaver</id> <phase>package</phase> <goals> <goal>copy</goal> </goals> <configuration> <artifactItems> <artifactItem> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.21</version> <outputDirectory>${project.build.directory}</outputDirectory> </artifactItem> </artifactItems> </configuration> </execution> </executions> </plugin> </plugins> </build>
Gradle项目
在build.gradle里加个任务,把织入器jar复制到build/libs目录:
task copyAspectJWeaver(type: Copy) { from configurations.runtimeClasspath.find { it.name.startsWith('aspectjweaver') } into "${buildDir}/libs" } jar.finalizedBy(copyAspectJWeaver)
第二步:修改Dockerfile
把织入器jar和应用jar一起复制到容器,然后启动时指定-javaagent参数:
FROM openjdk:11 # 把构建好的jar包(包括应用和织入器)都复制到容器的/app目录 COPY target/*.jar /app/ # 动态查找织入器的jar文件名,避免硬编码版本号 RUN ASPECTJ_WEAVER=$(ls /app/aspectjweaver-*.jar) && echo $ASPECTJ_WEAVER > /app/weaver-path.txt # 启动应用,加上织入器代理参数 CMD java -javaagent:$(cat /app/weaver-path.txt) -jar /app/app.jar
注意:如果是Gradle项目,COPY的路径要改成build/libs/*.jar /app/。
四、验证是否生效
写个简单的切面类测试下:
import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.springframework.stereotype.Component; @Aspect @Component public class TestLTWAspect { @Before("execution(* com.yourpackage..*.*(..))") public void beforeMethod() { System.out.println("LTW生效了!方法执行前切面触发"); } }
启动容器后查看日志,要是能看到上面的输出,就说明织入成功了。
内容的提问来源于stack exchange,提问作者Ivy Gorven
相关产品推荐
相关产品推荐

