idea中解決gradle依賴包衝突的問題
阿新 • • 發佈:2019-01-10
題主進行原有專案介面遷移新專案的時候遇到了如下問題:
執行gradle clean build是成功的但是啟動main函式就是不成功,在這裡樓主用的是springboot的main函式啟動方法
2018-06-06 16:04:43.060 [Tomcat-startStop-1] ERROR org.apache.catalina.core.ContainerBase: A child container failed during start java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]] at java.util.concurrent.FutureTask.report(FutureTask.java:122) at java.util.concurrent.FutureTask.get(FutureTask.java:192) at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:941) at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:872) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421) at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [Pipeline[StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[]]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5125) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 6 common frames omitted Caused by: org.apache.catalina.LifecycleException: Failed to start component [org.apache.catalina.authenticator.NonLoginAuthenticator[]] at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:167) at org.apache.catalina.core.StandardPipeline.startInternal(StandardPipeline.java:182) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 8 common frames omitted Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1186) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 10 common frames omitted
可以看到最終的問題是:
Caused by: java.lang.NoSuchMethodError: javax.servlet.ServletContext.getVirtualServerName()Ljava/lang/String; at org.apache.catalina.authenticator.AuthenticatorBase.startInternal(AuthenticatorBase.java:1186) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) ... 10 common frames omitted
找不到javax.servlet.ServletContext的getVirtualServerName()方法,而專案中應該呼叫的是Tomcat中的ServletContext.getVirtualServerName()方法,所以我們就要把javax.servlet.ServletContext的getVirtualServerName()方法從gradle配置檔案中清除並重新引入依賴就可以了,那麼我們如何找到對應的檔案在配置檔案中的什麼哪個包呢?
idea中雙擊shift可以找到對應的依賴位置可以看到這裡引入的不正確的包是 external:servlet-api:2.4.pd在右側的gradle工具中,可以檢視整體的依賴關係圖執行這個按鈕,在執行結構中搜索external:servlet-api:2.4就可以從樹狀圖看出對應的從屬關係,然後在build.gradle中將對應依賴中移除這個模組就可以了,這裡樓主就不演示搜尋了,因為我已經把對應依賴移除了~~~~
然後找到引入的模組,在build.gradle檔案中將其移除
compile(configuration: 'core', group: 'toolbox', name: 'web-tools', version: '2.0.+') {
exclude(module: 'spring')
exclude(module: 'commons-codec')
exclude(module: 'slf4j')
exclude(module: 'servlet-api')
}
再用gradle工具重新整理工程,重新匯入包再重啟專案就可以了~~~(在這裡不得不再誇一下idea真的賊好用!!!大愛~~筆芯~~)