The projects in the reactor contain a cyclic reference
图中模块C依赖于模块B,模块B依赖于模块A,而模块A又依赖于模块C,这样就出现了相互依赖情况,如果运行mvn compile会出现如下错误:
[INFO] Scanning for projects... [ERROR] The projects in the reactor containa cyclic reference: Edge between 'Ve rtex{label='org.kuuyee.sample:module-C:1.0-SNAPSHOT'}' and 'Vertex{label='org.ku uyee.sample:module-B:1.0-SNAPSHOT'}' introduces to cycle in the graph org.kuuyee .sample:module-B:1.0-SNAPSHOT --> org.kuuyee.sample:module-A:1.0-SNAPSHOT --> or g.kuuyee.sample:module-C:1.0-SNAPSHOT --> org.kuuyee.sample:module-B:1.0-SNAPSHO T -> [Help 1][ERROR] [ERROR] To see the full stack trace of the errors, re-run Maven with the -e swit ch.[ERROR] Re-run Maven using the -X switch to enable full debug logging.[ERROR] [ERROR] For more information about the errors and possible solutions, please rea d the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectCycleEx ception
1. 使用build-helper-maven-plugin解决相互依赖的问题我的解决办法就是先把相互依赖的模块整合在一起,相当于把这些模块合并成一个单独的模块统一编译。
如下图:图 2. 合并A、B、C三个模块为D模块
这样就产生了一个合并模块D,我们把它当做一个辅助构建模块,然后让A、B、C模块都依赖于D模块,这样的话就可以成功编译A、B和C模块,
如下图: 图 3. 基于D模块来分别编译A、B、C三个模块
要想把A、B、C三个模块整合在一起编译,需要借助build-helper-maven-plugin插件,这个插件在Maven构建周期提供一些辅助功能,下面列出插件的提供的功能列表: build-helper:add-source:添加更多的构建源码目录 build-helper:add-test-source:添加更多的测试源码目录 build-helper:add-resource:添加更多的资源目录 build-helper:add-test-resource:添加更多的测试资源目录 build-helper:attach-artifact:在安装和部署周期附加artifacts build-helper:maven-version:添加一个指定当前Maven版本的属性 build-helper:parse-version:添加一个指定组件版本的属性 build-helper:released-version:决定当前项目的最终版本 build-helper:remove-project-artifact:从本地资源库中移除项目的artifacts build-helper:reserve-network-port:Reserve a list of random and unused network ports. 在这里我们要用到build-helper:add-source这个功能,将模块A、B、C的源码路径加进来。 我们再添加一个辅助模块D,在辅助模块D中使用build-helper-maven-plugin插件,然后让模块A、B、C都依赖于辅助模块D,模块D的POM模型如下: 例 1. 辅助模块D的POM模型
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><groupId>org.kuuyee.sample</groupId><artifactId>sample-parent</artifactId><version>1.0-SNAPSHOT</version><relativePath>../../pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><groupId>org.kuuyee.sample</groupId><artifactId>module-D</artifactId><version>1.0-SNAPSHOT</version><packaging>jar</packaging><name>module-D</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><module.a.src>../../module/module-A/src/main/java</module.a.src><module.b.src>../../module/module-B/src/main/java</module.b.src><module.c.src>../../module/module-C/src/main/java</module.c.src></properties><build><plugins><!-- 解决模块相互依赖,综合所有相互依赖代码统一编译 --><plugin><groupId>org.codehaus.mojo</groupId><artifactId>build-helper-maven-plugin</artifactId><executions><execution><id>add-source</id><phase>generate-sources</phase><goals><goal>add-source</goal></goals><configuration><sources><source>${module.a.src}</source><source>${module.b.src}</source><source>${module.c.src}</source></sources></configuration></execution></executions></plugin></plugins></build><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency></dependencies>
</project>
maven处理循环依赖
在多maven工程的项目里,如果工程间存在循环依赖,构建就会报错。本文介绍一下循环依赖要怎么处理
1、 什么是循环依赖
如果工程A依赖工程B,工程B又依赖工程A,就会形成循环依赖。或者A依赖B,B依赖C,C依赖A,也是循环依赖
总的来说,在画出工程依赖图之后,如果发现工程间的依赖连线形成了一个有向循环图,则说明有循环依赖的现象
如果循环依赖发生在工程之间,则会影响构建,因为maven不知道应该先编译哪个工程。如果循环依赖发生在同一个工程的模块之间,虽然不影响编译,但是也是一种不好的实践,说明模块的设计有问题,应该避免
如果在模块内部,有几个类互相调用的话,我觉得可能是正常的。比如观察者模式里面,Observer和Observable就是互相依赖的
2、 怎么解决循环依赖
目前知道有2个办法可以解决
第一个办法是用build-helper-maven-plugin插件来规避。比如A依赖B,B依赖C,C依赖A的情况。这个插件提供了一种规避措施,即临时地将工程A、B、C合并成一个中间工程,编译出临时的模块D。然后A、B、C再分别依赖临时模块D进行编译
这种方法可以解决无法构建的问题,但是只是一个规避措施,工程的依赖关系依然是混乱的
第二个办法是通过重构,从根本上消除循环依赖
3、 如何重构
目前也知道2个重构的思路
第一个办法是平移,比如A和B互相依赖,那么可以将B依赖A的那部分代码,移动到工程B中,这样一来,B就不需要继续依赖A,只要A依赖B就可以了,从而消除循环依赖
第二个办法是下移,比如A和B互相依赖,同时它们都依赖C,那么可以将B和A相互依赖的那部分代码,移动到工程C里,这样一来,A和B相互之间都不依赖,只继续依赖C,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的
转载:http://hck.iteye.com/blog/1728329
The projects in the reactor contain a cyclic reference相关推荐
- Maven循环依赖问题:The projects in the reactor contain a cyclic reference:
打包项目出现了这样的问题: [INFO] Error stacktraces are turned on. [INFO] Scanning for projects... [ERROR] [ERROR ...
- illegal cyclic reference involving object InterfaceAudience
最近开发Spark应用程序,用到了scala反射,但是却一直报错循环引用 InterfaceAudience,感觉很奇怪,后来排查错因才发现,原来FileSystem类不可以作为反射的方法的参数,一旦 ...
- maven pom.xml解析、命令说明、依赖传递、继承、聚合、properties、build、依赖范围、版本仲裁、profile
maven是当前Java项目中用到最多的依赖管理工具.最开始的项目比较小引入的依赖包也少所以可以通过手动加载jar包的方式来管理依赖包:但随着项目越来越复杂各种大小框架层出不穷,一个项目的开发往往依赖 ...
- 3-maven学习-学习创建maven的依赖属性
一.什么是依赖属性 在por.xml配置中会添加所需要引入的jar包,前面已经知道,jar包有三要素:必须写 groupId:公司或组织的id artifactId:一个项目或者是项目中的一个模块的i ...
- 尚硅谷Manen2022----①基础概念,基础使用
文章目录 简介 应用场景 那些人需要 一.为什么学习maven 1.依赖管理工具 2.构建管理工具 二.什么是 Maven? 1.构建:将源代码编译成项目产品 2.依赖:使用jar包的需求 3.Mav ...
- Maven 当中的聚合
Maven 当中的聚合 文章目录 Maven 当中的聚合 1. 聚合本身的含义 2. Maven 中的聚合 3. 好处 4. 聚合的配置 5. 依赖循环问题 6. 最后:感谢 1. 聚合本身的含义 部 ...
- Maven Gradle 知识点总结
一个简洁的博客网站:http://lss-coding.top,欢迎大家来访 学习娱乐导航页:http://miss123.top/ (一)Maven 1. 了解 Maven 1.1 简介 Maven ...
- maven依赖循环引用_Maven说我在多模块项目中有一个循环引用,但无法弄清楚原因...
我有一个多模块项目,看起来像这样: 模块1 的pom.xml 模块2 的pom.xml 的pom.xml module2中的pom.xml依赖于module1. 当我运行mvn clean compi ...
- 解决Maven项目相互依赖/循环依赖/双向依赖的问题
很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块之间相互依赖的情况.这对于使用M ...
最新文章
- 42岁著名黑客去世,曾拯救互联网:揭开索尼“罪行”、发现DNS漏洞
- cisco 交换机vlan-trunk的配置详解及应用实例:
- 沃尔沃挖机计算机故障,沃尔沃挖掘机常见故障及原因总结,用户们可以看看
- pandas中size方法_eplot,在pandas中流畅的使用pyecharts!
- python中布尔运算可以用于浮点数比较_简单谈谈Python中的几种常见的数据类型
- SSM(SpringBoot+SpringMVC+Mybatis):班委信息管理附有GIF动图,博主可免费答疑
- iOS App 调用QQ客户端,发起临时会话
- windows下一次简单的拖库练习
- 微信公众号开发80端口映射解决方案
- centos修改ftp服务器密码是什么,centos ftp服务器密码忘记了
- mybatis 大小写 字符串_Mybatis查询时,区分大小写操作
- 将CD转MP3工具(WIN7以上可以使用)
- 计算机存储程序的理论由谁提出,存储程序的概念是由谁提出来的
- 2019读书计划(3)——《指数基金投资指南》
- linux下如何避免rsyslog系统日志不停打印到console
- 搜狗浏览器个人数据丢失解决方案
- 使用PyTorch实现鸟类音频检测卷积网络模型
- 长风破浪会有时,直挂云帆济沧海——纪念2020,展望2021
- 企业选择服务器托管的优势
- 国外交友网站开发源码 第十二篇