我有一個Swagger上的編譯依賴項目,它帶來了jackson-databind v2.4.5和一個testCompile依賴關係,該庫依賴於AWS SDK,它帶有jackson-databind v2.6.6 。從Gradle導入項目時IntelliJ錯誤的依賴關係
運行時的gradle從一個測試,一切工作正常和正確的更新傑克遜依賴v2.6.6是在類路徑:
+--- io.swagger:swagger-jersey2-jaxrs:1.5.10
| +--- io.swagger:swagger-jaxrs:1.5.10
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.4.5
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6
| | | \--- org.yaml:snakeyaml:1.12 -> 1.13
| | +--- com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.4.5
| | | +--- com.fasterxml.jackson.core:jackson-core:2.4.5 -> 2.6.6
| | | +--- com.fasterxml.jackson.core:jackson-databind:2.4.5 -> 2.6.6
的依賴關係的IntelliJ包含兩個版本:
但是,從IntelliJ運行測試時,IntelliJ會創建一個「classpath jar」(因爲類路徑太長)。當檢查META-INF/MANIFEST.MF中的類路徑時,我可以看到只包含較小版本的jar(2.4.5)。
java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectMapper.enable([Lcom/fasterxml/jackson/core/JsonParser$Feature;)Lcom/fasterxml/jackson/databind/ObjectMapper;
因爲老傑克遜API不包含此方法:
當測試使用AWS SDK這將導致異常。
這是不是可以預防?我正在使用一種解決方法,我在testCompile依賴項中添加了jackson-databind依賴項的2.6.6版本。但我想避免這種情況,因爲
- 我們不能直接使用傑克遜,它在gradle這個腳本只是因爲的IntelliJ的 每次正在使用AWS SDK改變圖書館
- ,我會改變依賴傑克遜以及
注意,我們使用的IntelliJ測試運行,只是因爲它比通過在本地工作站上的gradle產出(主要是由於漸進式編譯)運行測試速度更快。
我不能這樣做,如果我從編譯中排除依賴關係,那麼應用程序將無法工作。如果我運行生產代碼,無論是gradle還是IntelliJ,只有v2.4.5。 – sm4
噢,我的意思是如果它適用於測試,則可以將新版本添加到您的依賴項。或者,如果不會破壞構建,您可以從testCompile依賴關係中排除較新的版本。無論如何,這是不正確的,那麼你的測試和生產依賴不同。 – Stanislav
這就是我現在正在做的事(看問題) - 我在gradle腳本中放置了傳遞依賴的正確版本。我正在尋找一種方法來避免這種情況,因爲這是一種黑客行爲。 – sm4