原文出处:http://hck.iteye.com/blog/1728329

很​多​时​候​随​着​项​目​的​膨​胀​,模​块​会​越​来​越​多​,如​果​设​计​上​ 稍​有​不​慎​就​会​出​现​模​块​之​间​相​互​依​赖​的​情​况​。​这​对​于​使​用​Maven的​用​户​是​比​较​痛​苦​的​,因​为​出​现​模​块​之​间​相​互​依​赖​的​话​在​构​建​的​时​候​就​会​失​败​,Maven通​常​要​先​编​译​被​依​赖​的​模​块​,如​果​出​现​相​互​依​赖​Maven就​不​知​道​该​怎​么​办​了​。​下​图​描​述​了​三​个​Maven模​块​相​互​依​赖​的​场​景​:

图 1. A、​B、​C三​个​模​块​相​互​依​赖​

图​中​模​块​C依​赖​于​模​块​B,模​块​B依​赖​于​模​块​A,而​模​块​A又​依​赖​于​模​块​C,这​样​就​出​现​了​相​互​依​赖​情​况​,如​果​运​行​mvn compile会​出​现​如​下​错​误​:

[INFO] Scanning for projects... [ERROR] The projects in the reactor contain a 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模​型​

Java代码  

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">

org.kuuyee.sample

sample-parent

1.0-SNAPSHOT

../../pom.xml

4.0.0

org.kuuyee.sample

module-D

1.0-SNAPSHOT

jar

module-D

http://maven.apache.org

UTF-8

../../module/module-A/src/main/java

../../module/module-B/src/main/java

../../module/module-C/src/main/java

org.codehaus.mojo

build-helper-maven-plugin

add-source

generate-sources

add-source

${module.a.src}

${module.b.src}

${module.c.src}

junit

junit

3.8.1

test

【转载地址】http://www.blogjava.net/kuuyee/archive/2011/06/28/353158.html

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,也可以消除循环依赖

这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的

java 解决相互依赖_解决Maven项目相互依赖/循环依赖/双向依赖的问题(转载)相关推荐

  1. Maven项目导入idea爆红且依赖全部没有导进来的解决方法

    Maven项目导入idea爆红且依赖显示全部没有导进来的解决方法 第一步:检查导进来的项目的jdk版本和maven版本与自己的是否一致,不一致的先改成自己的版本. 第二步:找到pom.xml文件,右击 ...

  2. 3.将maven项目jar纳入maven仓库,Mave项目依赖另外一个Maven项目的案例

     1 若想让maven项目依赖另外一个maven项目,被依赖的项目要在maven仓库中有相应的jar包,所以要对依赖的项目执行mvninstall命令. 2 新建第二个项目模块HelloFrien ...

  3. 解决Maven项目相互依赖/循环依赖/双向依赖的问题

    很​多​时​候​随​着​项​目​的​膨​胀​,模​块​会​越​来​越​多​,如​果​设​计​上​ 稍​有​不​慎​就​会​出​现​模​块​之​间​相​互​依​赖​的​情​况​.​这​对​于​使​用​M ...

  4. maven 打包时缺少文件_解决Intellij Idea下使用Maven项目打包时部分文件缺失问题

    问题 Idea被越来越多的java开发者青睐,特别是丰富的插件极大方便了开发者.Idea虽然没有Eclipse的繁琐配置,但也会出现一些问题.问题如下: 一.在进行Maven项目打包的时候,会发现有的 ...

  5. 使用IDEA创建maven项目在pom.xml中添加依赖后,出现“Dependency ‘org.mybatis:mybatis:x.x.x‘ not found“解决过程

    目录 1.下载maven文件 2.设置setting.xml文件 3.创建maven项目 4.让idea使用我们自已的maven 5.配置pom.xml文件 首先清楚的是要想在IDEA 中创建mave ...

  6. JAVA解决实例问题_解决java方法

    没有R.java问题找不到getActionBar()方法 android项目,可是项目中没有重要的R.java,并且报错,说是找不到getActionBar()方法,上网寻找原因,终于寻得解决方法: ...

  7. java读取json配置文件_解决:java 读取 resources 下面的 json 文件

    前言:java 读取 工程下的配置文件,文件类型为 json(*.json),记录一下始终读取不到 json 文件的坑.maven项目 直接上工具类代码 package com.yule.compon ...

  8. maven检测依赖_检测Maven依赖中介

    maven检测依赖 从Maven 2.0.9开始,已向Maven添加了一个称为依赖中介的新功能. 依赖关系中介是Maven在特定情况下在依赖关系树中多次出现依赖关系时用来解决项目依赖关系的技术. 通常 ...

  9. eclipse不识别java,在Eclipse中运行的Maven项目存在问题,无法识别为Java项目

    我已经将现有的maven项目导入Eclipse.我试图为JUnit测试设置配置,但是我的项目不会成为可测试项目.当我手动输入项目名称时,收到以下消息: 指定的项目不是Java项目 我还注意到,在键入代 ...

最新文章

  1. matlab抽样模块是哪个,Matlab怎样进行信号的重建这个题先让把x(t)=sin(2πt)按照T=0.4抽样,这一步我已经...
  2. java数据类型的一些注意事项
  3. 迷你计算机笔记本,迷你笔记本电脑我选择了它,性能不错还超轻便携
  4. 苹果mac屏幕录像软件:ScreenFlow
  5. 东农计算机网络技术离线作业,东农16秋《电力系统分析》在线作业
  6. 魔乐科技 oracle 视频,MLDN魔乐科技JAVA+Oracle数据库视频课程
  7. MessageDigest 类的用法
  8. python opencv显示高分辨率图片时,如何改变窗口的大小
  9. vuex的知识点笔记
  10. Mushroom Classification(蘑菇分类数据集)
  11. 车牌识别采购、研发纵览
  12. 浅尝springboot
  13. LORA无线远传水表适者生存
  14. LiveNVR监控摄像头Onvif/RTSP视频流媒体服务平台概览负载信息实时展示取流中、播放中、录像中等使用数目说明
  15. SIwave仿真手册——软件基础(一)
  16. c语言接受mysql中文,C语言连接MySQL中文问题
  17. 如何高效的上传大文件?
  18. 数据库设计之实施与维护
  19. ACM概率期望dp刷题总结
  20. Linux内核的五大模块

热门文章

  1. vim插件管理工具Vundle的安装与配置
  2. 【抢答有奖】逻辑推理题
  3. 微服务----2 mq+nacos
  4. 传世服务器维护,传奇世界开服教程:传世服务器需要什么配置?
  5. 谷歌全面反攻 ChatGPT!PaLM 2、Gemini 双杀,Bard 正式开放
  6. 概率质量函数(PMF)、概率密度函数(PDF)和累积分布函数(CDF)定义
  7. 单车车路:中国的车路双智能到底有多牛?丨曼孚科技
  8. 小红书铺量霸屏是什么?把握投放节奏实现铺量霸屏
  9. Logistic函数的各个参数作用分析及其在电机控制中的应用
  10. Linux桌面基础2:X Window Manage——Xfce4