今天在編寫一個簡單spi 應用demo的時候,在編譯時總有一個其他的錯誤,如下:
ERROR Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project userloginspi: Fatal error compiling: java.lang.NoSuchMethodError: com.google.common.collect.ImmutableSet.toImmutableSet()Ljava/util/stream/Collector; -> [Help 1] (org.apache.maven.cli.MavenCli:1091)
因為這個插件一直使用 ,而且類似的代碼也寫過不可能出問題的,首先懷疑的是maven 工具,但是發現沒問題,這個錯誤的提示實際上是一個guava 包版本的問題,但是項目依賴的guava 已經包含功能了,而且很高了,嘗試過以下幾個調試
解決流程
- maven 構建提啟用調試
添加-X 發現依賴的包包含代碼,沒有問題 - 只能google了
大家的說法都是guava 版本,突然看到有人說,guava 已經在classpath了,實際上錯誤也符合,然后突然想起,當時為了測試yugabytedb 的cdc 功能
在ext 目錄copy 了一個jar 包,因為guava 包在java 開發中如此的方便,基本都會依賴的,刪除jar包 ,重新運行問題解決
說明
一般放置三方jar 包到java 的ext 目錄,仔細閱讀下jar包實現的功能吧,不然排查起來問額就太費事了,折騰了好幾個小時,還好最后解決了。
一個經驗教訓:不要輕易在java ext 目錄放任何三方jar包