繁体   English   中英

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

[英]Spring Boot Gradle multi-project build not seeing internal dependencies during tests

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

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

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

演示网站片段:build.gradle

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

依赖项目定义了一个 class 用于 web 项目DownstreamThing

web 项目尝试使用它来构建自己的 object,但在根项目级别的构建期间,它失败了。

> ./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 引导插件应用于demo-dependency项目。 这个插件的作用是将 jar 文件重新打包成一个胖 jar ,它需要一个特殊的类加载器来加载内容。

您仍然可以在没有插件的依赖项目中使用 Spring 引导依赖项(例如启动器)。 因此,如果可以,请删除它。

如果有特定原因,您需要保留原始 jar 文件,以便将其用作实际依赖项。 对于 Spring Boot 1.5.x,您可以通过以下方式执行此操作:

bootRepackage {
    classifier = "boot"
}

bootJar {
    enabled = true
}

But do note that I don't think Spring Boot 1.5 is fully compatible with Gradle 5 and later (at this time we are on 6.0), so you might need to either downgrade Gradle or upgrade Spring Boot.

Bjørn Vester 的回答让我指出了正确的方向。 spring-boot 插件导致 jar 任务对 go 出错。 我需要确保在启用 jar 任务时为依赖项禁用了 bootJar 任务。

Gradle 和 Spring 引导插件版本之间的配置更改使这在升级中丢失。

以前,我可以为 jar 启动后指定一个分类器:

bootRepackage  {
    classifier = 'exec'
}

现在,我需要启用和禁用相应的任务:

bootJar {
    enabled = false
}

jar {
    enabled = true
    archiveBaseName = "demo-dependency"
}

在较大的项目中,我之前有一个指定archiveBaseNamejar任务,但没有明确启用它来覆盖bootJar任务。 一旦我进行了上述更改(同时保持启动插件到位),事情就开始工作了。

请尝试编译而不是实现,例如: dependencies { compile project(':demo-dependency')... }

也许 DownstreamThing class 没有暴露于单元测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM