Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Boot Gradle多项目构建在测试期间看不到内部依赖关系_Java_Spring Boot_Gradle_Spring Boot Gradle Plugin - Fatal编程技术网

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

Java Spring Boot Gradle多项目构建在测试期间看不到内部依赖关系,java,spring-boot,gradle,spring-boot-gradle-plugin,Java,Spring Boot,Gradle,Spring Boot Gradle Plugin,我在从Gradle 4迁移到Gradle 5的一个更大的多项目构建中遇到了一个问题,并在一个更小、更简洁的构建中复制了这个问题来演示这个问题 我有两个项目在建设中。一个是另一个使用的依赖项(基本库) demo (root project) |- build.gradle | |--- demo-web |---|- build.gradle | |--- demo-dependency |---|- build.gradle 演示web的片段:build.gradle ... dependen

我在从Gradle 4迁移到Gradle 5的一个更大的多项目构建中遇到了一个问题,并在一个更小、更简洁的构建中复制了这个问题来演示这个问题

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

demo (root project)
|- build.gradle
|
|--- demo-web
|---|- build.gradle
|
|--- demo-dependency
|---|- build.gradle
演示web的片段: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中。为什么在测试任务期间找不到依赖项


示例的完整源代码如下:

请尝试编译,而不是像下面这样的实现: 依赖关系{ 编译项目(“:演示依赖项”) ... }


可能DownstreamThing类没有暴露在单元测试中。

我相信您得到该异常的原因是因为您已将Spring引导插件应用于
演示依赖项项目。这个插件的作用是将jar文件重新打包到一个胖jar中,这个胖jar需要一个特殊的类加载器来加载内容

您仍然可以在不使用插件的依赖项项目中使用Spring引导依赖项(例如启动器)。所以如果可以,就把它去掉

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

bootRepackage {
    classifier = "boot"
}

bootJar {
    enabled = true
}

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

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

在Gradle和Spring Boot插件版本之间进行的配置更改使其在升级中丢失

之前,我可以为jar开机后指定一个分类器:

bootRepackage  {
    classifier = 'exec'
}
现在,我需要启用和禁用相应的任务:

bootJar {
    enabled = false
}

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

在更大的项目中,我以前有一个
jar
任务,它指定了
archiveBaseName
,但没有显式地启用它来覆盖
bootJar
任务。一旦我做了上述更改(同时保留启动插件),事情就开始起作用了。

方向很好,在Kotlin,当我从root build.gradle中删除
apply(plugin=“org.springframework.boot”)
并应用于除通用模块之外的每个子模块时,它对我起到了作用