我在一个从第4级迁移到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:12ThingTest.java
@Test
public void testThing() {
DownstreamThing t = new DownstreamThing(); //line 12, ClassNotFoundException
assertTrue(t != null);
}在第4级中,我没有遇到任何问题,但只有在第5级中。为什么在测试任务中找不到依赖呢?
该示例的完整源代码如下:https://bitbucket.org/travelsized/gradle-problem/src/master/
发布于 2019-11-13 19:29:48
比约恩·弗斯特的回答使我指向了正确的方向。弹簧启动插件导致jar任务出错。我需要确保在启用jar任务时,对依赖项禁用bootJar任务。
为了在Gradle和Spring插件的不同版本之间进行配置上的更改,在升级过程中失去了这种功能。
以前,我可以为jar在引导后指定一个分类器:
bootRepackage {
classifier = 'exec'
}现在,我需要启用和禁用适当的任务:
bootJar {
enabled = false
}
jar {
enabled = true
archiveBaseName = "demo-dependency"
}在较大的项目中,我以前有一个jar任务,它指定了archiveBaseName,但没有显式地使它能够覆盖bootJar任务。一旦我做了上面的修改(同时保持启动插件的位置),事情就开始工作了。
发布于 2019-11-13 15:17:55
我相信他之所以得到这个例外,是因为您已经将Spring插件应用到了demo-dependency项目中。这个插件所做的是将jar文件重新打包到一个胖jar中,该jar需要一个特殊的类加载器来加载内容。
您仍然可以在不需要插件的情况下使用依赖项项目中的Spring依赖项(例如starters)。所以如果你能的话,就把它移开。
如果有特定的原因,您需要保留原始jar文件,以便将其用作实际的依赖项。对于SpringBoot1.5.x,您可以这样做:
bootRepackage {
classifier = "boot"
}
bootJar {
enabled = true
}但是请注意,我不认为Spring 1.5与Gradle 5和更高版本完全兼容(此时我们正在使用6.0),所以您可能需要降级或者升级Spring。
https://stackoverflow.com/questions/58838884
复制相似问题