Gradle依賴(循環依賴 / 排除依賴)

一、循環依賴

因爲歷史遺留版本,存在循環依賴問題,依賴關係如下圖所示:
在這裏插入圖片描述

  • 項目環境:IDEA、Gradle
  • 原先:在IDEA 2017.1.x版本下,通過Gradle添加依賴(build.gradle中)如下:
    core:compile project(':mqtt')
    mongo:無
    mqtt:compile project(':mongo')
    這樣在mongo模塊引用core模塊代碼處需要通過Alt+Enter,彈出框選擇添加core模塊依賴,如下圖:
    在這裏插入圖片描述
    提示有循環依賴不用理會,直接OK,如下圖:
    在這裏插入圖片描述
    這樣既可正常build project,運行項目,打包項目。(在Refresh Gradle Project操作時會使依賴失效,需要重新執行上面操作)。
  • 現在:將IDEA升級到2019.3版本後,按上述方式給mongo模塊添加core模塊依賴添加不上了。也就是面臨兩種選擇,一是重構模塊,去掉循環依賴;二是想辦法仍然使循環依賴能添加上。
    那麼怎麼仍然使循環依賴能添加上呢?經過摸索,終於找到了方法,各模塊build.gradle添加依賴配置不變,在mongo模塊添加:
testCompile project(':core')
compileOnly project(':core')

此時,Build Project,會報循環依賴的錯誤:

Circular dependency between the following tasks:
:core:classes
\--- :core:compileJava
     +--- :mongo:jar
     |    \--- :mongo:classes
     |         \--- :mongo:compileJava
     |              +--- :core:jar
     |              |    \--- :core:classes (*)
     |              +--- :mongo:jar (*)
     |              \--- :mqtt:jar
     |                   \--- :mqtt:classes
     |                        \--- :mqtt:compileJava
     |                             \--- :mongo:jar (*)
     \--- :mqtt:jar (*)

還需修改Gradle設置中如下配置爲IDEA:
在這裏插入圖片描述
這樣就可以正常添加循環依賴,正常build、run、打包了。
當然:項目應該避免出現循環依賴,如果存在循環依賴說明項目架構有問題😂

二、依賴排除

Gradle 排除排除本地項目 部分依賴
Gradle依賴排除
使用Gradle打包war文件

出現如下錯誤:

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
	org.glassfish.jersey.server.ApplicationHandler.<init>(ApplicationHandler.java:331)
	org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:392)
	org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:177)
	org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:369)
	javax.servlet.GenericServlet.init(GenericServlet.java:158)
	org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:474)
	org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:624)
	org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349)
	org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:783)
	org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:798)
	org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1434)
	org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

通過依賴分析發現是jersey-server依賴衝突(版本不同)所致。排除衝突的低版本com.sun.jersey:jersey-server即可

發佈了49 篇原創文章 · 獲贊 12 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章