一、循環依賴
因爲歷史遺留版本,存在循環依賴問題,依賴關係如下圖所示:
- 項目環境: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
即可