1. 程式人生 > >idea中解決gradle依賴包衝突的問題

idea中解決gradle依賴包衝突的問題

題主進行原有專案介面遷移新專案的時候遇到了如下問題:

執行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真的賊好用!!!大愛~~筆芯~~)