2016-12-02 162 views
1

我有一個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包含兩個版本:

Both dependencies displayed

但是,從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版本。但我想避免這種情況,因爲

  1. 我們不能直接使用傑克遜,它在gradle這個腳本只是因爲的IntelliJ的
  2. 每次正在使用AWS SDK改變圖書館
  3. ,我會改變依賴傑克遜以及

注意,我們使用的IntelliJ測試運行,只是因爲它比通過在本地工作站上的gradle產出(主要是由於漸進式編譯)運行測試速度更快。

回答

0

不能說,爲什麼IDE仍然有2個版本的這個庫,儘管Gradle解決了依賴關係。您可以嘗試手動排除這樣的傑克遜 - 數據綁定v2.4.5傳遞依賴的東西:

compile('io.swagger:swagger-jersey2-jaxrs:1.5.10') { 
    exclude group: 'com.fasterxml.jackson.core', module: 'jackson-databind' 
} 

,然後同步搖籃和IDEA項目。

+0

我不能這樣做,如果我從編譯中排除依賴關係,那麼應用程序將無法工作。如果我運行生產代碼,無論是gradle還是IntelliJ,只有v2.4.5。 – sm4

+0

噢,我的意思是如果它適用於測試,則可以將新版本添加到您的依賴項。或者,如果不會破壞構建,您可以從testCompile依賴關係中排除較新的版本。無論如何,這是不正確的,那麼你的測試和生產依賴不同。 – Stanislav

+0

這就是我現在正在做的事(看問題) - 我在gradle腳本中放置了傳遞依賴的正確版本。我正在尋找一種方法來避免這種情況,因爲這是一種黑客行爲。 – sm4