java.lang.ClassNotFoundException: retrofit2.Retrofit$Builder解决思路
ClassNotFoundException報錯
- 具體問題
- 報錯詳情
- 推測可能是jar包問題
- 問題總結自定義依賴缺少依賴jar
具體問題
Caused by: java.lang.NoClassDefFoundError: retrofit2/converter/simplexml/SimpleXmlConverterFactory報錯詳情
org.springframework.web.util.NestedServletException: Handler dispatch failed; nested exception is java.lang.NoClassDefFoundError: retrofit2/Retrofit$Builderat org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1006)at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:974)at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:877)at javax.servlet.http.HttpServlet.service(HttpServlet.java:661)at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:851)at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)...java.lang.NoClassDefFoundError: retrofit2/Retrofit$Builder
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1006)
推測可能是jar包問題
Retrofit是一個自定義jar包中的pom依賴(jar包被引入到項目中依賴)。
<dependency><groupId>com.squareup.retrofit2</groupId><artifactId>retrofit</artifactId><version>2.5.0</version></dependency>打開terminal,定位到工程pom.xml所在的目錄,執行 mvn dependency:tree 打印maven依賴關系樹 。
mvn dependency:tree如果你的操作系統環境定義了多個本地maven repo的配置,則需要在后面帶上你的setttings.xml配置。
例如:
打印結果:
[INFO] Scanning for projects... [INFO] [INFO] ----------------------< net.ering.van:van-share >----------------------- [INFO] Building van-lte-boot 0.0.1-SNAPSHOT [INFO] --------------------------------[ jar ]--------------------------------- [INFO] [INFO] --- maven-dependency-plugin:3.0.2:tree (default-cli) @ van-share --- [INFO] net.ering.van:van-share:jar:0.0.1-SNAPSHOT [INFO] +- org.testng:testng:jar:6.9.10:test [INFO] | +- com.beust:jcommander:jar:1.48:test [INFO] | \- org.beanshell:bsh:jar:2.0b4:test [INFO] +- org.mockito:mockito-all:jar:1.10.19:test [INFO] +- org.springframework.boot:spring-boot-starter-test:jar:2.0.4.RELEASE:test [INFO] | +- org.springframework.boot:spring-boot-starter:jar:2.0.4.RELEASE:compile [INFO] | | +- org.springframework.boot:spring-boot-starter-logging:jar:2.0.4.RELEASE:compile [INFO] | | | +- ch.qos.logback:logback-classic:jar:1.2.3:compile [INFO] | | | | \- ch.qos.logback:logback-core:jar:1.2.3:compile [INFO] | | | +- org.apache.logging.log4j:log4j-to-slf4j:jar:2.10.0:compile [INFO] | | | | \- org.apache.logging.log4j:log4j-api:jar:2.10.0:compile ... [INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided ... [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1.321 s [INFO] Finished at: 2020-10-14T15:28:11+08:00 [INFO] ------------------------------------------------------------------------打印結果中檢索servlet
[INFO] +- javax.servlet:javax.servlet-api:jar:3.1.0:provided發現其他的基本都是compile,而servlet是provided結尾,是項目pom中加上了scope限制
<dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>${servlet-version}</version><scope>provided</scope></dependency>回到報錯信息第一行,鼠標點擊顯示如下:
說明tomcat中也有servlet-api包,provided可以避免發生沖突。
因為provided表示該包只在編譯和測試的時候用,所以,當啟動tomcat的時候,tomcat中的servlet-api就不會和javax.servert的依賴沖突了。
這個provided的只在編譯和測試期有效,已提供范圍的依賴在編譯classpath 可用,運行時不可用。并且不被傳遞。
問題總結自定義依賴缺少依賴jar
最后發現是引入的自定義依賴的源碼缺少了Retrofit的依賴的引入。
總結
以上是生活随笔為你收集整理的java.lang.ClassNotFoundException: retrofit2.Retrofit$Builder解决思路的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C#中利用Linq.Dynamic实现简
- 下一篇: C#利用反射实现实体类ListT索引器