Gradle 与 Spring Boot 应用程序的多项目依赖关系

Posted

技术标签:

【中文标题】Gradle 与 Spring Boot 应用程序的多项目依赖关系【英文标题】:Gradle multiproject dependency with spring boot application 【发布时间】:2018-08-29 02:32:10 【问题描述】:

我的 Spring Boot 项目结构如下:

client-stp-grid-publisher:
+---.build.gradle
+---.client-stp-grid-publisher-acceptance
|   +---build.gradle
+---.client-stp-grid-publisher-core
|   +---build.gradle

client-stp-grid-publisher-acceptance 需要由task ':client-stp-grid-publisher-core:bootRepackage' 创建的可执行jar 来启动进程 在运行验收测试以测试完整流程之前。所以我正在运行核心项目的bootRepackage task,然后复制可执行jar 到acceptance-test project build/tmp directory

验收测试也使用项目':client-stp-grid-publisher-core'中的一些类。

因为task ':client-stp-grid-publisher-core:bootRepackage'task ':client-stp-grid-publisher-acceptance:test' 之前首先被执行 一些使用核心项目中的类的测试失败了。

如果我将核心项目构建限制为distZip task,那么验收项目下的所有测试都会通过。

我在使用 bootRepackage 运行验收测试时遇到错误:

failure message="java.lang.NoClassDefFoundError: Lcom/markets/efx/client/stp/builder/GridDealsObjectBuilder;" 
type="java.lang.NoClassDefFoundError">java.lang.NoClassDefFoundError: Lcom/markets/efx/client/stp/builder/GridDealsObjectBuilder

但我的要求需要 bootRepackage 以便我可以从验收测试项目运行可执行 jar。

如果我能获得有关如何解决问题的建议或一些解决方法以达到要求,这将非常有帮助? 谢谢,

【问题讨论】:

【参考方案1】:

您不必手动复制 jar。

settings.gradle:

include 'client-stp-grid-publisher'
include 'client-stp-grid-publisher-acceptance'
include 'client-stp-grid-publisher-core'

'client-stp-grid-publisher-acceptance' 的 build.gradle

...
dependencies 
    compile project(":client-stp-grid-publisher-core")
    ...

我建议阅读有关使用 gradle 设置多模块项目的内容: https://spring.io/guides/gs/multi-module/

【讨论】:

这些我已经在你提到的项目中了。问题是核心项目任务 bootRepackage 创建胖可执行 jar。所以理想情况下 bootRepackage 应该在验收测试测试用例运行之前运行。但在这种情况下,测试用例会因 NoClassDefFoundError 而失败。

以上是关于Gradle 与 Spring Boot 应用程序的多项目依赖关系的主要内容,如果未能解决你的问题,请参考以下文章

无法加载驱动程序类:com.mysql.jdbc.Driver 与 Gradle 和 Spring Boot

Dockerfile 和 Docker Compose 与 Java Spring Boot、Gradle 和 PostgreSQL [重复]

将 lombok 与 gradle 和 spring-boot 一起使用

spring boot gradle 插件、应用程序插件和 gradle 2.3 包装器

使用gradle BOM和spring-boot(多模块应用程序)哪种方式更好

Gradle + Nexus 管理Spring Boot的Jar