当前位置: 首页 > 科技观察

如何避免Java项目中的循环依赖问题

时间:2023-03-16 19:07:23 科技观察

前言当我们开发一个Java项目时,我们首先要做的就是添加我们需要使用的依赖、库或者框架。为此,我们使用依赖管理工具(例如Maven或Gradle)来管理我们的项目依赖项。我们添加到项目中的每个依赖项都包含其他依赖项。我们都知道依赖转移的概念。在很多情况下,项目的依赖转移不会有任何问题,因为依赖管理工具(Maven或Gradle)很好地解决了不同库之间的版本冲突。但是,在其他情况下,当使用我们的API/库或不同的库依赖于同一个库的不同版本时,这些冲突会产生一些错误。例如:图中我们的API库导入了一些库,但是这些库同时依赖了不同版本的库X,所以会出现依赖冲突。如何解决这个问题在Maven&Gradle库管理工具出现之前,我们在开发Java项目时,需要花费大量的时间来解决我们项目的依赖冲突问题。Maven&Gradle工具的引入极大的解决了我们依赖的问题,但是很多时候我们还是会看到这样的东西:ClassNotFoundException,MethodNotSupportedException,NoClassDefNotFound。这时候,很多情况下,我们是靠开发人员的经验,手动解决的。同时,我们也可以借助一些开发工具来帮助我们排查问题,比如:在Eclipse/IntelliJ开发工具中DependencyAnalyzer可以显示所有的依赖关系,协助开发者定位冲突的库。当您检测到哪些库包含导致问题的依赖项时,您需要从我们的依赖管理文件(pom.xml或build.gradle)中排除所有包含不同版本依赖项的库。Maven-enforcer-plugin插件Maven提供了Maven-Enforcer-Plugin插件,用于验证协议的符合性(或验证开发环境)。比如JDK的版本、Maven的版本、开发环境(Linux、Windows等)、依赖jar包的版本等。插件只需要在pom中引入:org.apache.maven.pluginsmaven-enforcer-plugin1.3.1enforceenforce执行mvncleanpackage时,console中会打印出冲突jar版本及其父pom如下:[INFO]---maven-enforcer-plugin:1.3.1:enforce(enforce)@uaf-uafei-provider---[WARNING]Dependencyconvergenceerrorforcom.google.guava:guava:16.0依赖路径为:+-com.uaf.uafei:uaf-uafei-provider:0.2.09-SNAPSHOT+-com.uaf:microservice-sleuth:0.2.09-SNAPSHOT+-org.springframework.cloud:spring-cloud-starter-openfeign:2.1.5.RELEASE+-io.github.openfeign:feign-hystrix:10.4.0+-com.netflix.archaius:archaius-core:0.7.6+-com.google.guava:guava:16.0and+-com.uaf.uafei:uaf-uafei-provider:0.2.09-SNAPSHOT+-com.uaf:microservice-apollo:0.2.09-SNAPSHOT+-com.google.inject:guice:4.1.0+-com.google.guava:guava:19.0[警告]Rule0:org.apache.maven.plugins.enforcer.DependencyConvergencefailedwithmessage:Failedwhileenforcingreleasabilitytheerror(s)are[Dependencyforconvergenceerr.guava:guava:16.0pathstodependencyare:+-com.uaf.uafei:uaf-uafei-provider:0.2.09-SNAPSHOT+-com.uaf:microservice-sleuth:0.2.09-SNAPSHOT+-org.springframework.cloud:spring-cloud-starter-openfeign:2.1.5.RELEASE+-io.github.openfeign:feign-hystrix:10.4.0+-com.netflix.archaius:archaius-core:0.7.6+-com.google.guava:guava:16.0and+-com.uaf.uafei:uaf-uaf-provider:0.2.09-SNAPSHOT+-com.uaf:microservice-apollo:0.2.09-SNAPSHOT+-com.google.inject:guice:4.1.0+-com.google.guava:guava:19.0]结论依赖冲突是开发过程中比较耗时的问题。通过上面的一些功能,可以帮助我们尽快定位问题,但是最好的解决办法是在开发中遵循规范和约定好于配置