簡體   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