Spring Boot多模块GraalVM原生构建失败,如何指定模块构建?
解决多模块Spring Boot项目原生构建仅针对指定模块的问题
问题背景
你在多模块Maven项目中尝试用GraalVM构建Spring Boot原生可执行文件,执行./mvnw native:compile时失败,报错提示父模块缺少主类——这是因为Maven默认会对所有模块执行原生构建,而父模块和common模块并不包含可执行的主类。你的项目结构如下:
- parent(继承spring-boot-starter-parent)
- common
- app-1(含主类)
- app-2(含主类)
两种解决方法
方法一:命令行指定目标模块
直接在执行命令时,通过-pl参数指定要构建的app模块,同时用-am参数确保依赖的common模块也被正确构建:
./mvnw native:compile -pl app-1,app-2 -am
-pl:指定要构建的模块(多个模块用逗号分隔)-am:自动构建指定模块依赖的所有模块(这里会先构建common,再处理app-1和app-2)
方法二:通过Maven插件配置全局控制
在父模块的pom.xml中,将原生插件默认设置为跳过执行,只在需要构建的子模块中开启:
- 父模块pom.xml中配置插件:
<build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <version>0.9.22</version> <configuration> <!-- 默认跳过所有模块的原生构建 --> <skip>true</skip> </configuration> </plugin> </plugins> </build>
- 在app-1和app-2的
pom.xml中,覆盖父模块的配置,开启原生构建:
<build> <plugins> <plugin> <groupId>org.graalvm.buildtools</groupId> <artifactId>native-maven-plugin</artifactId> <configuration> <!-- 开启当前模块的原生构建 --> <skip>false</skip> <!-- 若Spring Boot未自动检测到主类,可手动指定 --> <!-- <mainClass>com.example.app1.Application</mainClass> --> </configuration> </plugin> </plugins> </build>
之后直接执行./mvnw native:compile,Maven就只会对app-1和app-2执行原生构建了。
内容的提问来源于stack exchange,提问作者Dean Xu
相关产品推荐
相关产品推荐

