-
2020-12-30 08:12:53
问题背景
在使用多模块开发时,通常一个模块(A)可能会需要其它模块(B)中的类或方法,这时就产生了依赖关系,也就是 A 依赖 B。
要解决上述依赖,有两种方案1、将B发布到 repo 仓库(可以为本地仓库)
2、A直接依赖B
1、将 B 发布到仓库,修改 B 模块中的 build.gradle,增加apply plugin: 'maven'uploadArchives {
repositories {
mavenDeployer {
repository(url: uri("../../repo"))
}
}
}1
2
3
4
5
6
7
8
9
其中B模块具有如下配置:group 'com.test'version '0.0.1'1
2
这时在模块A中,就可以在 build.gradle 文件的 dependencies 节点,增加:compile 'com.test:b:0.0.1'1
2、A 直接依赖模块 B
在 A 模块中的 build.gradle 的 dependencies 节点,增加:compile project(':b')1
更多相关内容 -
handling-peer-dependencies:开发模块时如何处理对等依赖性
2021-05-19 19:11:24开发模块时如何处理对等依赖性 什么是对等依赖关系,它有什么问题? 是一种特殊的依赖项,对可重用模块非常有用: 要求用户安装模块需要运行的依赖项,而无需特别指定版本 防止用户的应用程序node_modules中具有... -
Android组件化开发1解决组件间相互依赖问题
2021-03-31 01:01:20最近在把项目封装成组件化,出现一个很奇怪的问题,由于说刚上手项目,组件化经验也不是特别丰富,导致出现了很多小问题,这里就不过多纠结,实战出...果然和错误日志一样,就是两个组件之间相互依赖引用导致的问题...目录
4.删除module_home组件后可以看到项目编译通过,成功运行,项目运行截图如下:
前言:
最近在把项目封装成组件化,出现一个很奇怪的问题,由于说刚上手项目,组件化经验也不是特别丰富,导致出现了很多小问题,这里就不过多纠结,实战出真知,遇到问题去分析问题产生的原因及解决它就可以 了。实现上代码,出现的错误日志如下:
1.我们翻译一下日志:
意思就是说组件home和组件common间相互依赖,循环引用,所以发生错误。
2.在看我的代码:
2.1 module_home组件
2.2 module_common组件
果然和错误日志一样,就是两个组件之间相互依赖引用导致的问题。
3.解决方法如下:只需要删除其中一个组件的引用即可
这里我删除module_common组件中引用的module_home组件,因为module_common组件说我项目的基本组件框架,所以删除home.
4.删除module_home组件后可以看到项目编译通过,成功运行,项目运行截图如下:
5.总结:今天这个问题发生很突然,由于经验不足导致的小问题,在项目做组件化时一定要注意不能相互循环依赖和引用.以上就是遇到的问题和解决方案,希望对有同样问题的小伙伴有帮助,如果您有更好的意见和方法,欢迎提出来,给我留言,非常感谢您的指点和讨论。
-
解决maven多模块之间的相互依赖的方案
2020-12-19 07:42:41本来应该是开发包可以单边引用产品基础包的,由于开发不规范最终导致产品基础包和开发包存在了相互引用。针对当时我们的项目我考虑了两种方案:方案一、将产品基础包和开发包整合成一个源码包,再重构为Maven项目。...近期在做一个普通javaweb项目转转换成maven项目的任务。
原项目类型:javaWeb项目
两个源码包一个产品基础包,一个基于产品基础包的开发包,两个都是普通javaWeb项目。本来应该是开发包可以单边引用产品基础包的,由于开发不规范最终导致产品基础包和开发包存在了相互引用。
针对当时我们的项目我考虑了两种方案:
方案一、将产品基础包和开发包整合成一个源码包,再重构为Maven项目。
产品基础包编译成jar包,jsp页面整合到开发包中。后续产品基础包如果升级,重新编译成jar包更换现有jar即可,涉及用到的jsp需要项目组开发团队整合到正在使用的开发包中按正常版本发布流程提交源码即可。(这种方案需人工整合为一个源码包,相互间的引用自然就不存在了)
方案二、使用Maven聚合工程
使用Maven聚合工程,将产品基础包和开发包分别构建成两个Maven模块,然后将开发包目前最新版本打成jar包放入Maven仓库由产品基础包引用从而断掉产品基础包对开发包之前的引用,之后开发时务必做到开发包单边引用产品基础包,便不会再出现产品基础包对开发包的引用。剩下的就由开发包单边依赖产品基础包即可,从而可以避免循环依赖。后续产品基础包如果升级,按正常版本发布流程提交源码即可,无需人工整合,各自提交到各自的Maven模块,无影响。(这种方案后期要确保:开发人员严格遵守开发规范开发包单边引用产品基础包)
考虑到一下两种原因,最终采用了第二种方案:
1、整合两个源码包需要花费很长时间影响进度,且整合过程中也存在一定的风险。
2、后续产品基础包可能存在升级
3、还有其他模块功能待整合上线,需要考虑到可扩展性。
很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块之间相互依赖的情况。这对于使用Maven的用户是比较痛苦的,因为出现模块之间相互依赖的话在构建的时候就会失败,Maven通常要先编译被依赖的模块,如果出现相互依赖Maven就不知道该怎么办了。下图描述了三个Maven模块相互依赖的场景:
图中模块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解决相互依赖的问题我的解决办法就是先把相互依赖的模块整合在一起,相当于把这些模块合并成一个单独的模块统一编译,
这样就产生了一个合并模块D,我们把它当做一个辅助构建模块,然后让A、B、C模块都依赖于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
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,也可以消除循环依赖
这两种重构方式都是可行的,具体采用哪种方式要根据实际情况来判断。不管采取哪种方式,都需要对代码进行修改,有时候并不是那么容易的
-
Maven项目常见问题实战(一) 解决相互依赖
2021-03-15 17:53:21很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块...下图描述了三个Maven模块相互依赖的场景:图中模块C依赖于模块B,模块B依赖于模块A,而模块A又依赖于模块C,这样就出现了相互依赖情况...很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块之间相互依赖的情况。这对于使用Maven的用户是比较痛苦的,因为出现模块之间相互依赖的话在构建的时候就会失败,Maven通常要先编译被依赖的模块,如果出现相互依赖Maven就不知道该怎么办了。下图描述了三个Maven模块相互依赖的场景:
图中模块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 switch.
[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 read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectCycleException
使用build-helper-maven-plugin解决相互依赖的问题
我的解决办法就是先把相互依赖的模块整合在一起,相当于把这些模块合并成一个单独的模块统一编译,如下图:
这样就产生了一个合并模块D,我们把它当做一个辅助构建模块,然后让A、B、C模块都依赖于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模型如下:
org.kuuyee.samplesample-parent1.0-SNAPSHOT../../pom.xml4.0.0org.kuuyee.samplemodule-D1.0-SNAPSHOTjarmodule-Dhttp://maven.apache.orgUTF-8../../module/module-A/src/main/java../../module/module-B/src/main/java../../module/module-C/src/main/javaorg.codehaus.mojobuild-helper-maven-pluginadd-sourcegenerate-sourcesadd-source${module.a.src}${module.b.src}${module.c.src}junitjunit3.8.1test
这时候你在运行例子就能够成功构建了!
2011-06-28
-
event-monitoring:用于事件监听,模块开发彻底分开,解决模块之间的事件依赖和加载顺序
2021-07-08 12:18:36用于事件监听,模块开发彻底分开,解决模块之间的事件依赖和加载顺序 模块分离,控制加载顺序,事件不丢失 优势一、彼此之间有相互控制的事件时,不需要按顺序依赖加载,也不需要再加些总体控制层的东西! 使多人... -
处理Android Studio中相互依赖的模块之间的公共依赖关系
2021-06-13 02:58:35假设我的Android Studio项目中有2个模块:---- :A---- :B其中:A依赖于B:---- :A ---> + :B---- :BA和B都需要库L:使事情复杂化---- :A ---> + :B+ :L---- :B ---> + :L最初包含的模块的gradle文件:模块A... -
maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到
2019-10-22 17:13:26现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖base工程。 ... -
Springboot中多模块依赖问题
2021-11-26 12:02:12我在使用IDEA进行多模块开发的时候,需要加入其他模块实现的功能作为依赖。一开始我是如下的结构: 模块1 子模块1 ... pom.xml 子模块2 ... pom.xml pom.xml 模块2 ... pom.xml 当我的模块2想要引用子... -
idea2020-springboot项目-多级父子工程(聚合工程)子模块相互引用依赖无法install(启动项目)问题
2021-03-16 19:28:17idea2020-springboot项目-多级父子工程(聚合工程)子模块相互引用依赖无法install(启动项目)问题目录文章目录1、简介2、问题3、解决4、总结***后记*** :内容1、简介此项目目前为3级springboot开发,maven工程,创建... -
maven项目模块之间的互相依赖问题
2020-04-14 17:44:24报错信息: Error:java: Annotation processing is ...Please ensure that all modules from cycle [模块A,模块B,模块C] are excluded from annotation processing 编译时就无法通过 原因: maven項目在分模块进行... -
C++开发中一个解决方案里,两个项目的相互引用,相互依赖的实现方法(解决方法)
2018-09-13 10:29:50visual studio项目,C++一个解决方案里不同的项目之间不能相互依赖吗? 众所周知,在一个visual studio solution种可能由多个project组成,这些project会存在依赖关系。规定每个project是一个模块,所有的模块都是... -
基于vue-cli搭建多模块且各模块独立打包的项目
2021-01-19 19:55:252、各个模块相互不受影响,所以不受框架和开发模式的制约 3、不同模块可以分开部署 4、后期维护风险小,可以持续的、稳定的进行维护 缺点: 1、各个模块有相互独立的资源包,那么如果有相同的资源引用,不能复用... -
SpringBoot多模块中互相依赖的时候不能打包问题解决办法!
2020-09-19 18:33:14在SpringBoot多个模块开发过程中,如果模块有互相依赖的情况下,那么在打包的时候,会有问题,自己研究了半天,把我遇到的问题和解决办法,给大家分享一下. 项目目录 其中的straw-commons为被依赖的模块,其他的模块依赖这... -
maven多项目打包报错---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到 package xxx does not exist
2020-12-10 18:09:56springboot 项目多模块已成开发大势所趋,抽出一个parent父工程,子模块基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖子模块工程。 问题: ... -
maven工程多模块之间互相依赖 时的打包问题
2021-02-25 15:08:49为了描述方便,我们将父级工程叫作parent,子包分别为childa,childb,childc,其中chlidb和childc依赖于chlida解决方案1: 被依赖的jar(childa)打出来后以本地依赖的形式打进jar包 <dependency> <groupId&... -
gradle多模块开发
2014-08-10 14:50:31gradle多模块开发,详细请参考:http://blog.csdn.net/xiejx618/article/details/38469865 -
多模块依赖工程打包问题
2022-03-29 11:30:06因为项目是多个模块工程开发,下一个模块依赖上一个模块,打包下一个模块时,出现了本地仓库找不到上一个模块依赖的问题。 这个问题其实很简单,完全不需要修改pom.xml文件。只需要install上一个模块,再package下一... -
【Spring】整体架构及模块依赖关系
2020-11-30 20:50:28主要包含 Spring 框架基本的核心工具类, Spring 的其他组件都要用到这个包里的类, Core 模块是其他组件的基本核心。 2.spring-beans(BeanFactory) 它包含访问配直文件、创建和管理 bean 以及进行 Inversion o -
maven父子结构相互依赖所遇到的坑
2021-02-11 21:16:33场景:因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子...