一、循环依赖
因为历史遗留版本,存在循环依赖问题,依赖关系如下图所示:
- 项目环境: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
即可