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

标签 java spring-boot gradle spring-boot-gradle-plugin

我在从 Gradle 4 迁移到 5 的更大的多项目构建上遇到了问题,并在更小、更简洁的构建上复制了该问题以演示该问题。

我有 2 个项目正在构建中。一个是另一个使用的依赖项(基本库)。

demo (root project)
|- build.gradle
|
|--- demo-web
|---|- build.gradle
|
|--- demo-dependency
|---|- build.gradle

演示网站片段:build.gradle

...
dependencies {
    implementation project(':demo-dependency')
    ...
}
...

依赖项项目定义了一个在 Web 项目中使用的类,DownstreamThing

Web 项目尝试使用它来构造自己的对象,但在根项目级别的构建过程中,它失败了。

> ./gradlew build
> Task :demo-web:test

com.example.demo.ThingTest > testThing FAILED
    java.lang.NoClassDefFoundError at ThingTest.java:12
        Caused by: java.lang.ClassNotFoundException at ThingTest.java:12

ThingTest.java

    @Test
    public void testThing() {
        DownstreamThing t =  new DownstreamThing(); //line 12, ClassNotFoundException
        assertTrue(t != null);
    }

我在 Gradle 4 中没有遇到任何问题,但只有在 Gradle 5 中才遇到问题。为什么在测试任务期间找不到依赖项?

示例的完整源代码在这里:https://bitbucket.org/travelsized/gradle-problem/src/master/

最佳答案

我相信您收到该异常的原因是因为您已将 Spring Boot 插件应用到 demo-dependency 项目。这个插件的作用是将jar文件重新打包成一个fat jar,需要一个特殊的类加载器来加载内容。

在没有插件的情况下,您仍然可以在依赖项项目中使用 Spring Boot 依赖项(例如启动器)。因此,如果可以的话,请将其删除。

如果有特殊原因需要它,您将需要保留原始 jar 文件,以便将其用作实际的依赖项。对于 Spring Boot 1.5.x,您可以使用以下方法来做到这一点:

bootRepackage {
    classifier = "boot"
}

bootJar {
    enabled = true
}

但请注意,我认为 Spring Boot 1.5 并不与 Gradle 5 及更高版本完全兼容(目前我们使用的是 6.0),因此您可能需要降级 Gradle 或升级 Spring Boot。

关于java - Spring Boot Gradle 多项目构建在测试期间看不到内部依赖关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58838884/

相关文章:

java - 如何在 Mac 上部署具有防火墙权限的应用程序?

java - 如何水平添加TextView?

java - 主数据源中没有可用的名为 'entityManagerFactory' 的 bean

spring-mvc - @RefreshScope - JUnit 测试用例

java - writeArray 二进制文件未在 readArray 中显示完整数组

java - .war 的相对路径如何工作?

gradle - 用Gradle v6替换 “GradleVersion.current()”吗?

java - 无法建立APK或执行应用程式

android - 使用 Gradle 构建 Android 项目失败

java - 在 Java 中,我有一个浮点值,我左对齐,但它应该是一个货币值,$ 符号不会向左移动