Java Spring Boot Gradle多项目构建在测试期间看不到内部依赖关系
我在从Gradle 4迁移到Gradle 5的一个更大的多项目构建中遇到了一个问题,并在一个更小、更简洁的构建中复制了这个问题来演示这个问题 我有两个项目在建设中。一个是另一个使用的依赖项(基本库)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
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”)
并应用于除通用模块之外的每个子模块时,它对我起到了作用