Gradle依赖(循环依赖 / 排除依赖)

一、循环依赖

因为历史遗留版本,存在循环依赖问题,依赖关系如下图所示:
Gradle依赖(循环依赖 / 排除依赖)_第1张图片

  • 项目环境:IDEA、Gradle
  • 原先:在IDEA 2017.1.x版本下,通过Gradle添加依赖(build.gradle中)如下:
    core:compile project(':mqtt')
    mongo:无
    mqtt:compile project(':mongo')
    这样在mongo模块引用core模块代码处需要通过Alt+Enter,弹出框选择添加core模块依赖,如下图:
    Gradle依赖(循环依赖 / 排除依赖)_第2张图片
    提示有循环依赖不用理会,直接OK,如下图:
    Gradle依赖(循环依赖 / 排除依赖)_第3张图片
    这样既可正常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:
Gradle依赖(循环依赖 / 排除依赖)_第4张图片
这样就可以正常添加循环依赖,正常build、run、打包了。
当然:项目应该避免出现循环依赖,如果存在循环依赖说明项目架构有问题

二、依赖排除

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

出现如下错误:

java.lang.NoSuchMethodError: javax.ws.rs.core.Application.getProperties()Ljava/util/Map;
	org.glassfish.jersey.server.ApplicationHandler.<;init&gt;(ApplicationHandler.java:331)
	org.glassfish.jersey.servlet.WebComponent.<;init&gt;(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即可

你可能感兴趣的:(gradle,idea)