多模块Gradle项目:WebJar未放置到META-INF/resources目录解决方案咨询
问题修复方案
我看了你的Gradle配置,问题出在frontend模块的任务配置和后端的依赖方式上——现在你的React构建产物被打包成了一个单独的frontend.jar丢到BOOT-INF/lib里,而不是合并到Spring Boot jar的META-INF/resources目录下。下面是具体的修复步骤:
1. 调整Frontend模块的Gradle配置
Frontend模块不需要java插件(它是纯前端项目),而且当前的任务配置没有把包含React构建产物的webjar设为模块的默认构件,导致后端依赖的是一个空的默认Java jar。修改frontend/build.gradle如下:
plugins { id "com.moowork.node" version "1.3.1" } node { version = "12.9.1" download = true } // 构建React生产包的任务 task bundle(type: NpmTask, dependsOn: npmInstall) { args = ["run", "build"] } // 前端测试任务 task uiTest(type: NpmTask) { environment = ["CI": "true"] args = ["run", "test"] } // 前端开发启动任务 task run(type: NpmTask) { args = ["start"] } // 检查任务关联前端测试 check.dependsOn(uiTest) // 生成包含React构建产物的WebJar,产物直接放到META-INF/resources task webjar(type: Jar) { dependsOn(bundle) // 确保先完成React构建 from(fileTree("build")) { into "META-INF/resources" } } // 将webjar设为模块的默认构件,让后端依赖时自动使用这个包 artifacts { archives webjar }
2. 修复Backend模块的Gradle配置
你当前手动配置了jar任务,这会和Spring Boot插件提供的bootJar任务冲突,而且会导致依赖打包逻辑混乱。修改backend/build.gradle:
移除手动的jar配置
删掉这段自定义的jar打包逻辑:
// jar { // manifest { attributes "Main-Class": "com.example.kasahararestapi.StockCheckAppApplication" } // from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } // }
Spring Boot插件会自动识别你的启动类(带@SpringBootApplication的类),并生成正确的可执行jar结构。
确保依赖Frontend的WebJar
你的依赖配置已经正确,保持即可:
implementation project(path: ':frontend')
现在frontend的默认构件是包含React资源的webjar,后端会自动依赖它。
3. 重新构建项目
执行以下命令清理旧构建产物并生成最终的Spring Boot可执行jar:
./gradlew clean ./gradlew backend:bootJar
为什么这样能解决问题?
- 移除frontend的
java插件后,模块不再生成空的默认Java jar,而是把包含React静态资源的webjar作为唯一的构件。 - Spring Boot的
bootJar任务会自动将依赖的webjar中META-INF/resources目录下的内容,合并到最终生成的jar的对应目录中,这样Spring Boot就能直接加载这些静态资源,正确渲染React页面。
内容的提问来源于stack exchange,提问作者Yuka
相关产品推荐
相关产品推荐

