You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 15:55:20