我試圖通過實驗將一個MAVEN java項目移植到gradle。我遇到的其中一個問題是由於NoSuchMethodError在運行時(執行期間)發生而未能執行單元測試。我打電話給FileUtils.write()
方法。NoSuchMethodError在測試下運行gradle
我修改代碼來跟蹤在加載文件實用程序類的類加載器提供類路徑和我有以下幾點:
C:/Sdk/gradle-2-7/lib/commons-io-1.4.jar
C:/Users/<me>/.gradle/caches/modules-2/files-2.1/commons-io/commons-io/2.4/b1b6ea3b7e4aa4f492509a4952029cd8e48019ad/commons-io-2.4.jar
出的,我看到有2個版本的commons-IO的在測試運行期間的類路徑和來自Gradle的類路徑是第一個,因此具有更高的優先級。
根本原因是什麼?這可以如何解決?
實際上,我希望除了我的gradle項目的依賴關係中明確聲明的classpath之外,沒有JAR可用。
更新:看來,我已經得到了有關的根本原因的想法 - 被測試的項目是「gradle這個插件」,並編譯它的gradle中我有build.gradle
到指定以下內容:
dependencies {
compile gradleApi()
}
這滲透到我的項目捕獲所有gradle依賴項。雖然我還沒有看到的方式來解決這個問題:
- 我無法將其刪除,因爲該項目不會編譯
- 我不能排除一些事情,因爲gradle這個不支持此爲
gradleApi()
(見http://gradle.1045684.n5.nabble.com/exclude-some-dependencies-from-gradleApi-dependency-td5712103.html) 。 - 我不能只添加那些我真正需要的gradle jar作爲依賴關係 - 我沒有看到任何方式在編譯依賴關係中明確引用它們,我沒有看到任何包含這些工件的公共存儲庫。注意:對於MAVEN構建,我已手動將它們上載到本地MAVEN庫中。
是您試圖使用FileUtils.write但舊版本(1.4)沒有該方法(類'碰撞')的問題? – Ethan
這是發生的問題,但根問題稍有不同 - 我在插件中引用的庫使用commons-io的較新版本,而gradle提供的運行時提供較舊的版本。所以...... gradle應該在測試時以某種方式提供ClassLoaders的分離,讓「自己的代碼」和「單元測試下的插件代碼」與不同版本的第三方庫共存。 –
Gradle在這裏做着正確的事情,保護您免受不正確的測試。當你的插件被加載時,它會運行到你的測試看到的相同的jar錯過匹配。我會嘗試使用Java8或Groovy來解決需要這個庫。 – Ethan