[英]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"
}
在較大的項目中,我之前有一個指定archiveBaseName
的jar
任務,但沒有明確啟用它來覆蓋bootJar
任務。 一旦我進行了上述更改(同時保持啟動插件到位),事情就開始工作了。
請嘗試編譯而不是實現,例如: dependencies { compile project(':demo-dependency')... }
也許 DownstreamThing class 沒有暴露於單元測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.