- 浏览: 1064049 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块之间相互依赖的情况。这对于使用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模型
【转载地址】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,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的
【转载地址】http://www.kaifajie.cn/kaifa_qita/7063.html
图 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模型
<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>
【转载地址】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,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的
【转载地址】http://www.kaifajie.cn/kaifa_qita/7063.html
评论
6 楼
winhbb
2017-11-06
我刚好遇到了一个问题(在可以依赖注入的场合有效):
有两个模块A和B,当前B已经依赖了A,但是由于之前设计的不合理,导致目前A又需要使用B中的相关方法,目前我临时采取的措施是,在A中定义一个接口,由于B依赖A,所以B可以直接实现该接口,然后A中通过接口声明并注入B中的实例即可。
有两个模块A和B,当前B已经依赖了A,但是由于之前设计的不合理,导致目前A又需要使用B中的相关方法,目前我临时采取的措施是,在A中定义一个接口,由于B依赖A,所以B可以直接实现该接口,然后A中通过接口声明并注入B中的实例即可。
5 楼
ganbo
2016-08-25
总结的好,文章给力。
4 楼
q63176347
2015-12-18
谢谢,需要这篇文章太久了
3 楼
小白941条狗
2015-09-16
感谢分享,有没有一种方式可以,即保证模块互相独立,又能解决相互依赖产生的问题
2 楼
bughope
2014-04-25
学习下
1 楼
刚开始吧
2013-05-23
顶,哥们。文章很给力。
发表评论
-
maven 获取jar从不同的仓库搜寻排序
2014-01-08 14:48 1503maven仓库读取备忘录: 在setting.xml配置了镜 ... -
Tomcat-maven-plugin插件使用
2014-01-03 14:50 2509maven-tomcat-plugin让maven与tomca ... -
制作maven archetype方法
2013-09-09 00:38 5904一直想生成一个archetype,节省初始化项目时间,时间让各 ... -
创建简单的maven archetype
2013-09-09 00:32 867如果你想定义一个maven工程模板,有一种很快的方法: 1.定 ... -
使用assembly plugin实现自定义打包
2013-09-08 23:56 577在上一篇文章中,讨论到在对maven的机制不熟悉的情况下,为了 ... -
maven相关
2013-09-08 11:32 8081、Maven内置变量说明: ${basedir} ... -
Maven 打包 jar 、war 文件时,不将 pom.xml 等打包进包中
2013-09-08 11:29 3207如果是 jar 包,在 Plugin 中配置 <buil ... -
maven super pom 文件位置
2013-09-05 16:00 1556D:\apache-maven-3.0.4\lib 下的 ma ... -
Maven profile filter
2013-09-05 15:03 2152使用maven的profile和filter插件管理配置项 ... -
maven资源文件引用
2013-08-27 00:07 1559资源文件引用: 1、maven默认系统的资源文件在src/m ... -
maven实现JS+CSS自动压缩
2013-08-26 22:02 10711. maven实现js+css自动压缩完整代码 <? ... -
maven 常用命令goal
2013-08-26 17:12 8171.显示一个插件所有的goal 2.创建一个基于模版的项目, ... -
maven 命令背后是如何工作的
2013-08-26 17:08 776Maven强大的一个重要的原因是它有一个十分完善的生命周期模型 ... -
maven war包插件
2013-08-23 14:38 0<plugins> <plug ... -
Maven 打包 jar 、war 文件时,不将 pom.xml 等打包进包中
2013-08-23 14:33 1359如果是 jar 包,在 Plugin 中配置 <bui ... -
使用maven打war包过程中对文件进行copy、rename(move)、delete操作
2013-08-23 14:29 14061、在pom中声明ant插件:maven-antrun-plu ... -
eclipse下实现maven项目在tomcat容器热部署方法
2013-08-23 14:27 24511、eclipse安装maven插件、svn插件 2、从sv ... -
maven-antrun-plugin(运行ant的插件)
2013-08-23 14:22 1105[转载声明] 转载时必须 ... -
Maven实战之antrun插件
2013-08-23 14:18 982在Maven实际使用过程中,有时候在对一些旧有的项目的做从Ma ... -
maven filter转换时容易忽略的错误
2013-04-18 11:48 2002使用Maven管理,定义了Filter,配置文件中的动态值都由 ...
相关推荐
《基于Springboot的人力资源管理系统设计》 在现代企业中,人力资源管理是至关重要的组成部分,它涉及到员工招聘、培训...此外,这还是一个绝佳的实践平台,可以锻炼你的问题解决能力、代码调试技巧以及团队协作经验。
在本文中,我们将深入探讨如何在Eclipse集成开发环境中(IDE)安装CNN-Bi-LSTM-Eclipse演示项目。...同时,不断学习和理解CNN、LSTM以及注意力机制的原理,将有助于你更好地利用这个项目来解决问题。
- `pom.xml`:Maven项目配置文件,定义了依赖和构建过程。 学习这个项目,开发者可以深入理解SpringBoot后端开发和AngularJS前端开发的实践,同时提升项目管理和协作能力。此外,对于毕业设计或课程设计而言,它...
- `pom.xml`: Maven项目的配置文件,定义依赖和构建过程。 - `.gitignore`: Git版本控制的忽略文件列表。 - `README.md`: 项目说明文档。 这个项目提供了从后端到前端的完整流程,涉及SpringBoot的RESTful API...
- **跨域处理**:使用SpringBoot的CORS配置,解决前后端跨域问题。 - **状态码处理**:后端返回HTTP状态码,前端根据状态码判断请求结果并做出相应反馈。 通过这个项目,学生能够深入理解SpringBoot后端开发和Vue....
- 自动配置:SpringBoot会根据项目依赖自动配置相应的bean。 - 嵌入式Servlet容器:如Tomcat、Jetty,无需单独部署。 - Starter POMs:简化Maven配置,提供了一组可选的依赖集合。 - Actuator:提供健康检查、指标、...
3. **Pom.xml**:这是Maven项目的配置文件,包含项目依赖。在这里,应该列出了Netty库和其他可能的依赖,如WebSocket的相关库,如`netty-all`或单独的WebSocket模块。 4. **src**:源代码目录,通常包含Java源文件...
起步依赖是Spring Boot通过Maven或Gradle插件提供的,简化了添加依赖的过程。Actuator提供了健康检查、指标、审计跟踪等功能,便于监控和管理应用。 2. **Thymeleaf** Thymeleaf允许开发者用自然的HTML来编写模板...
每个起步依赖都是一个包含相关依赖的Maven或Gradle模块,例如`spring-boot-starter-web`用于构建Web应用,`spring-boot-starter-data-jpa`用于数据库访问。 2. **自动配置(Auto Configuration)**:SpringBoot的...
1. 项目结构:SSM项目通常遵循Maven或Gradle的目录结构,Vue.js项目则按照SPA(Single Page Application)模式组织。两者需通过前后端分离的方式协同工作。 2. 开发环境:使用IDEA或Eclipse等Java IDE,配合VSCode...
6. **构建工具配置**:如Maven或Gradle的pom.xml或build.gradle文件,用于项目构建和依赖管理。 7. **微信小程序**:相关的小程序源代码,包括json、wxml、wxss、js文件,以及微信开发者工具的配置文件。 学习这个...
这可以帮助开发者更好地调试和优化代码,提升问题解决能力。 "工具"则指的是JavaEE开发中常用的工具,如集成开发环境(IDE)如Eclipse、IntelliJ IDEA,版本控制系统如Git,构建工具如Maven或Gradle,以及持续集成/...
2. **起步依赖(Starter POMs)**:预定义的Maven或Gradle依赖集,帮助开发者快速添加需要的功能,如`spring-boot-starter-web`用于Web开发。 3. **内嵌服务器**:Spring Boot可内嵌Tomcat或Jetty服务器,无需额外...
【标题】"基于SSM+Vue的校园二手交易管理系统"是一个综合性的项目,结合了Java后端技术SSM(Spring、SpringMVC、MyBatis)与前端Vue.js框架,旨在为大学生提供一个便捷的在线交易平台,促进校园内部的资源循环利用。...
这个版本的Spring MVC为非Maven项目提供了方便,避免了开发者为了集成Spring框架而手动下载和配置各种依赖的麻烦。 1. **spring-context-4.3.4.RELEASE.jar**:这是Spring框架的核心上下文模块,包含了Bean工厂和...
另外,可能会使用Maven或Gradle作为项目构建工具,管理依赖关系。 3. **自然语言处理(NLP)**:OctoAsk系统的核心部分是其NLP模块,可能包含了词法分析、句法分析、语义解析等技术,用于理解用户输入的问题。可能...
1. 添加Mybatis依赖:在Maven项目中,需要在pom.xml中引入Mybatis的依赖。 2. 配置Mybatis核心配置文件:mybatis-config.xml,包括数据源、事务管理器、SqlSessionFactory等配置。 3. 创建Mapper接口和Mapper XML...
这个系统是为了解决学生宿舍设备报修问题而设计的,它结合了Spring、SpringMVC和MyBatis(SSM)三大Java Web框架,并引入了前端Vue.js库,以提供更高效、友好的用户体验。下面将详细阐述系统的组成部分和相关技术点...
EasyChatServer的代码可能组织为Maven或Gradle项目,开发者可以通过导入`EasyChatServer-master`目录下的源码,在IDE如IntelliJ IDEA或Eclipse中进行编译和调试。部署时,可以打包成可执行的JAR文件,然后在服务器上...