Spring boot 和 Gradle 多模块项目,无法正确加载依赖项

Posted

技术标签:

【中文标题】Spring boot 和 Gradle 多模块项目,无法正确加载依赖项【英文标题】:Spring boot and Gradle multi-modules project, failed to load dependencies correctly 【发布时间】:2018-10-06 09:00:49 【问题描述】:

基本上我有一个使用 Gradle 构建的 Spring Boot 项目。 该项目有一个根项目,其中包含另外 4 个子模块。 根项目 settings.gradle 如下所示:

rootProject.name = 'proj'

include 'proj-app'
include 'proj-integration-tests'
include 'proj-model'
include 'proj-service'

app 模块包含 spring-boot-gradle-plugin 并暴露了一些 api。

我想做的是创建仅包含集成测试的 proj-integration-tests 子模块。问题从这里开始,因为我需要 proj-app 依赖项。

所以在 proj-integration-tests 我有 build.gradle 包含:

dependencies 
  testCompile('org.springframework.boot:spring-boot-starter-web')
  testCompile('org.springframework.boot:spring-boot-starter-test')
  testCompile project(':proj-app')
  testCompile project(':proj-model')

自集成测试以来我需要 proj-app 依赖项:

@RunWith(SpringRunner.class)
@SpringBootTest(classes = ProjApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)

需要启动位于 proj-app 模块中的 Spring Boot 应用程序(ProjApplication.class)。

我从 Gradle 得到的错误是:“找不到符号 ProjApplication”。

为什么 Gradle 无法正确管理 proj-app 依赖项? 在此先感谢 ;)

【问题讨论】:

ProjApplication 在包中吗?而且我假设您看到的错误是在编译集成测试时,对吗? ProjApplication 位于默认包中,这意味着它对包中的类不可见,或者应用程序的 JAR 未添加到 archives 配置中。 另外,为什么不在proj-app 中进行集成测试?然后,您不必在集成测试运行之前等待应用程序打包。虽然这确实取决于集成测试的性质。 ProjApplication 位于 proj-app 包下。是的,您是对的,在集成测试的编译过程中会引发错误。 IDE 似乎没有抱怨它,但是当我从 cli 构建项目时出现错误。 我想要一个只包含集成测试的不同模块,因为测试人员也可以访问这个模块,我认为这样更好。 好的,很公平。那么,您使用的是什么版本的 Gradle? proj-integration-tests/src/test/java 下是否有集成测试?您是否在集成测试项目中运行gradle test?运行gradle :proj-integration-test:dependencies --configuration testCompileClasspath时是否出现项目依赖? 【参考方案1】:

似乎 proj-app 依赖项是以 Spring Boot 方式构建的。这意味着获得的工件是一个可执行的 spring boot far jar。这就是为什么 proj-integration-tests 在编译时无法从 proj-app 中找到类的原因。 因此,为了维护可执行 jar,并将 proj-app 作为 proj-integration-tests 模块中的依赖项,我修改了 proj app 中的 build.gradle 以创建两个 jar:以弹簧启动方式和标准版:

bootJar 
baseName = 'proj-app-boot'
enabled = true


jar 
baseName = 'proj-app'
enabled = true

【讨论】:

以上是关于Spring boot 和 Gradle 多模块项目,无法正确加载依赖项的主要内容,如果未能解决你的问题,请参考以下文章

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

使用Spring Boot Gradle插件的多模块项目

多模块 Gradle 项目 - 从 Spring-Boot 1.5 迁移到 2.1

无法集成测试 gradle 多模块 Spring-Boot-Application

如何在多模块spring boot应用程序gradle中只访问不同模块的一个类?

Spring Boot Gradle 多项目构建在测试期间看不到内部依赖项