Spring Boot多模块项目SAM构建失败:依赖模块符号找不到
问题现象
Spring Boot多模块项目,本地通过Maven命令或IntelliJ IDE构建正常,已执行mvn install,但使用AWS SAM执行sam build时,依赖本地Api模块的Register模块编译失败,提示找不到com.careerwatch.Api相关的包、类及符号。
报错核心原因
Api模块使用了Spring Boot Maven插件的repackage目标,默认会将生成的jar替换为可执行jar。这种jar的类文件都放在BOOT-INF/classes目录下,而非普通jar的根目录结构,导致Register模块在依赖Api模块的jar时,无法找到对应的包和类。
本地构建正常是因为多模块项目内依赖时,Maven直接引用Api模块编译后的target/classes目录,而非jar文件;而SAM构建会将代码复制到临时目录,执行完整的Maven生命周期,Register模块依赖的是Api模块install到临时仓库的可执行jar,从而触发编译错误。
解决方案
1. 修改Api模块的Spring Boot Maven插件配置
在Api模块的pom.xml中,给spring-boot-maven-plugin添加classifier配置,让插件同时生成普通依赖jar和可执行jar:
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.0.6</version> <configuration> <!-- 指定可执行jar的后缀,生成普通jar和带exec后缀的可执行jar --> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build>
配置后,Api模块会生成两个jar:
Api-0.0.1-SNAPSHOT.jar:普通结构的jar,供其他模块依赖使用Api-0.0.1-SNAPSHOT-exec.jar:可执行jar,用于单独运行Api模块
2. 验证Register模块的依赖配置
确保Register模块的pom.xml中对Api模块的依赖坐标正确,无需额外修改,Maven会自动识别普通jar作为依赖:
<dependency> <groupId>com.backend</groupId> <artifactId>Api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
3. 重新执行SAM构建
先清理本地构建产物,再执行SAM构建:
mvn clean install sam build
额外优化建议
在template.yml中,建议将每个函数的CodeUri指向对应的模块目录,避免SAM构建整个项目时的冗余操作:
- CareerWatchFunction的
CodeUri改为./Api - RegisterFunction的
CodeUri改为./Register
修改后的template.yml片段:
Resources: CareerWatchFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./Api # 其他配置不变... RegisterFunction: Type: AWS::Serverless::Function Properties: CodeUri: ./Register # 其他配置不变...
内容的提问来源于stack exchange,提问作者Emiliano Escobedo

