-
2020-04-14 17:44:24
报错信息:
Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [模块A,模块B,模块C] are excluded from annotation processing
编译时就无法通过
原因:
maven項目在分模块进行开发时,模块之间只能是单方向依赖/传递依赖,但是万万不可多个模块之间互相依赖。这样是无法编译通过的。
解决方法:
1.互相依赖的类或方法,放到公共模块,这样就可以啦!但是,有时候代码之间的依赖性是很强的,只能是重新规划一下模块之间的功能。遇到这种情况往往是很令人头疼的,往往是仁者见仁智者见智啦!
2.网上有的小伙伴说引入XX (我找不到了 /狗头)依赖,将ABC模块放到一起编译,但是这样代码还是混乱的,只是治标不治本(当然我自己还没试过,哈哈哈)更多相关内容 -
解决maven多模块之间的相互依赖的方案
2020-12-19 07:42:41原项目类型:javaWeb项目两个源码包一个产品基础包,一个基于产品基础包的开发包,两个都是普通javaWeb项目。本来应该是开发包可以单边引用产品基础包的,由于开发不规范最终导致产品基础包和开发包存在了相互引用。...近期在做一个普通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构建分布式项目时子模块相互依赖打包技巧
2022-04-19 21:20:18直接在父pom文件引入如下插件将会导致Maven打的微服务Jar包不会将外部依赖导入其中,且其他模块在依赖本模块的时候可能出现找不到类的报错。即无法通过 java -jar xxx.jar 命令来启动服务。 <build> <...场景
最近在学习使用Jenkins自动化部署分布式微服务的时候,需要将微服务打成Jar包发送到服务器制作成镜像供Jenkins拉取运行,了解到
spring-boot-maven-plugin
插件可以完成Maven工程的打包任务。问题
直接在父pom文件引入如下插件将会导致Maven打的微服务Jar包不会将外部依赖导入其中,且其他模块在依赖本模块的时候可能出现找不到类的报错。即无法通过
java -jar xxx.jar
命令来启动服务。<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
原因
spring-boot-maven-plugin
打出来的Jar包默认是不可依赖的,需要进行一些额外的配置。
比如一个微服务工程中,往往会抽取出来一个common
公共模块,在common
公共模块中使用了spring-boot-maven-plugin
的默认配置build,其他依赖了common
模块的比如provider
或者order
在使用打包命令进行打包时就会出错,错误是在provider
或者order
中找不到common
中的类,原因就是此插件默认默认打包出来的Jar是不可依赖的。解决方案
在父工程pom文件和公共模块pom文件做一些修改
<!-- 父pom --> <build> <plugins> <!-- 资源文件拷贝插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- Java编译插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> <!-- maven打包插件 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> <!-- common pom --> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <!-- 这个属性为可执行jar包的名字后缀 --> <configuration> <classifier>exec</classifier> </configuration> </plugin> </plugins> </build> <!-- 其余子模块会继承父模块 -->
配置完后在进行
mvn clean package
或者mvn clean install
命令打包服务后,可用java -jar xxx.jar
正常启动。其他细节
在使用
spring-boot-maven-plugin
插件进行打包操作的时候强烈建议指明JDK版本,不然可能在使用了一些Java8新特性的时候可能受到类似不识别Lambda,请使用Resource8这样的错误。<properties> <java.version>1.8</java.version> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> </properties>
原文参考:
https://blog.csdn.net/DamonREN/article/details/85091900 -
Maven本地子模块互相依赖
2020-01-06 09:10:16很多时候,我们自己的项目有许多的子模块,之间互相有依赖,但是我们没有私服来发布打好的jar包. 最常见的就是本地有一个Util包, 随手写的其他项目想要引用, 却苦于没有私服. 把代码扔到同一个项目, 强迫症有忍不住. 这...很多时候,我们自己的项目有许多的子模块,之间互相有依赖,但是我们没有私服来发布打好的jar包.
最常见的就是本地有一个Util包, 随手写的其他项目想要引用, 却苦于没有私服. 把代码扔到同一个项目, 强迫症有忍不住.
这个问题Maven是有解决方案的.本质上还是打包发布,只是不再发布到远端的Maven仓库,而是打包完成之后, 将这个jar包安装到本地的maven即可.
首先,在你的
util
子模块下执行下列命令.# 打包 mvn clean package # 安装到本地mvn mvn install:install-file -Dfile=your_jar_file_path.jar -DgroupId=your_groupId -DartifactId=your_artifactId -Dversion=your_version # 检查是否安装成功 ll ~/.m2/your_groupId/your_artifactId/
之后, 在需要引入这个jar包的项目的
pom.xml
文件中,按照正常使用添加即可.<dependency> <groupId>your_groupId</groupId> <artifactId>your_artifactId</artifactId> <version>your_version</version> </dependency>
当mvn需要引入的时候,会自动从本地仓库去加载的.
完。
联系我
最后,欢迎关注我的个人公众号【 呼延十 】,会不定期更新很多后端工程师的学习笔记。
也欢迎直接公众号私信或者邮箱联系我,一定知无不言,言无不尽。
以上皆为个人所思所得,如有错误欢迎评论区指正。
欢迎转载,烦请署名并保留原文链接。
联系邮箱:huyanshi2580@gmail.com
更多学习笔记见个人博客或关注微信公众号 <呼延十 >------>呼延十
-
maven 多模块 相互依赖 打jar包流程及注意事项
2020-08-14 09:36:11创建maven多模块项目,编写代码,添加子模块相互依赖; 举例来说,父项目为cloud-maven-learn,子项目为learn-server(springcloud 的服务治理和服务发现项目,集成eureka),learn-product(springcloud业务模块... -
Maven工程模块间存在依赖时如何打包
2021-12-04 09:46:58通过执行mvn -pl 模块名 -am实现存在相互依赖的模块打包 -
Maven解决依赖冲突的解决方式
2022-04-10 18:03:041.使用第一声明者优先原则 2.使用路径近者优先原则 3.手动排除依赖 4.版本锁定 -
maven 多个模块中相互的依赖
2020-12-20 12:22:311、在D盘创建一个文件夹:ssm2、在ssm文件夹下,用maven指令创建两个项目(一个java项目,一个web项目)创建 ssm-biz 的java项目的指令如下:mvn:archetype:create -DgroupId=... -
解决Maven项目相互依赖/循环依赖/双向依赖的问题
2016-11-08 10:42:23这对于使用Maven的用户是比较痛苦的,因为出现模块之间相互依赖的话在构建的时候就会失败,Maven通常要先编译被依... -
maven模块之间的互相依赖问题的解决方式
2019-01-16 17:55:53Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [book-rpc,book-api] are excluded from annotation processing 解决方式: -
maven项目多模块相互调用方法
2021-06-10 14:29:28maven项目多模块相互调用方法问题背景解决方法方法1方法2 问题背景 maven项目包括多个子模块,类似下图: 现在【web】模块某个类想要调用【service】模块的某个类的某个方法。 如果直接通过@Autowired注入【service... -
maven打包以及module相互依赖问题
2022-05-01 16:19:171. maven打包 1.1 pom、jar、war pom:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。 <packaging>pom</packaging> 子module: // 1、jar方式 <... -
Maven 多模块互相依赖打包问题
2021-08-05 11:42:10项目有多个模块,然后把一些公共的抽取出来(比如说实体类,Service等)单独为一个模块,然后再需要用到的模块中引入就行了,运行是没有问题的,然而打 jar 包的时候 maven 会一直提示找不到依赖的那个模块,从而... -
IDEA多模块项目创建、不同模块间的maven相互依赖
2021-01-31 19:02:18就以快速构建Dubbo项目为例,需要创建具有三个模块的项目:生产者Producer、消费者Consumer以及公用的API接口依赖,并且需要将API依赖到生产者和消费者模块中。 1. 创建API接口 2. 创建生产者Provider模块 ... -
IDEA上搭建多模块的Maven项目(相互依赖)
2018-05-14 22:47:22需求:idea上搭建maven项目 moduleA,moduleA 依赖moduleB 和 moduleC,moduleC 依赖moduleB .其中moduleB 和moduleC中只有serve层到数据库层的文件方式一,moduleA引用moduleB和moduleC的jar形式。... -
maven工程多模块之间互相依赖 时的打包问题
2021-02-25 15:08:49maven项目互相之间存在依赖,在idea中可以正常运行,但是打包时会出现在仓库中检索不到依赖的问题; 为了描述方便,我们将父级工程叫作parent,子包分别为childa,childb,childc,其中chlidb和childc依赖于chlida解决... -
解决Maven项目相互依赖/循环依赖/双向依赖的问题(转载)
2021-03-15 17:53:26原文出处:http://hck.iteye.com/blog/1728329很多时...这对于使用Maven的用户是比较痛苦的,因为出现模块之间相互依赖的话在构建的时候... -
maven多模块之间的互相依赖问题
2020-02-25 18:48:34处理模块之间的依赖关系(模块之间不能有循环依赖) Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [basic_core,basic_util,crm_common,crm_... -
完美解决 Maven Module 互相依赖no dependency information available的问题
2021-09-06 23:57:57最近掉进maven的坑就是在多模块的maven项目中,如果我们每个项目之间互相依赖,如果跟项目中设置了denpendency变量版本号就会导致隔代模块的dependency无法找到。出现以下的error。 <dependency> <... -
maven多模块和依赖冲突问题汇总记录
2020-12-20 12:22:32目录前言:今天学习和总结了...一句话概括就是:一个父模块作为版本控制多个子模块,子模块负责接入到父模块当中作为整个项目的过程。多Module管理项目的几种方式:按照单模块拆分为多个子模块,比如将MVC三层架构拆... -
maven项目子模块相互引用无效
2018-09-17 15:36:36搭建maven项目的时候,dao模块引用beans模块的pojo,发现没有效果 dao模块是新建的模块,都没配置什么怎么会引用不到 叫大佬过来演示排错了一波 ...1.子模块依赖重复,因为之前创建了几次dao,IDEA父项目自动... -
创建 maven 多模块工程并解决子模块之间循环依赖问题
2021-06-17 16:36:28想在 eclipse 中创建一个拥有子模块的 maven 工程,因为在实际项目中用到的就是多模块工程,原谅我不知道这个工程是如何创建的,因为以前没有接触过,在这里记录下创建工程。 创建父 maven 工程: 打开 eclipse... -
maven子模块之间互相引入依赖,pom文件报错
2018-12-10 11:01:10父项目是A,两个子项目是B和C,B中想引入C,会发现报错了,原因是我们install的顺序有问题 我建议: 先把你添加的其他依赖全部去掉,只剩下单纯的B-A,B-C的依赖,然后先 maven install父项目,把父子关系建立起来... -
maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到
2019-10-22 17:13:26现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子模块(Module A、 Module B …)。Module A 以及Module B工程都需要依赖base工程。 ... -
Maven项目常见问题实战(一) 解决相互依赖
2021-03-15 17:53:21很多时候随着项目的膨胀,模块会越来越多,如果设计上 稍有不慎就会出现模块...下图描述了三个Maven模块相互依赖的场景:图中模块C依赖于模块B,模块B依赖于模块A,而模块A又依赖于模块C,这样就出现了相互依赖情况... -
maven父子结构相互依赖所遇到的坑
2021-02-11 21:16:33场景:因为之前用到的是,基于springboot框架所搭建的maven工程,而且都是相互独立的。现研发经理要求将所有工程进行整合和规范化,所以抽出一个parent父工程,base基础模块(包含一些公用的实体类和工具类等),以及其他子... -
maven相互依赖打包异常问题
2020-12-22 13:27:14最近项目上使用的是idea ide的多模块话,需要模块之间的依赖,比如说系统管理模块依赖授权模块进行认证和授权,而认证授权模块需要依赖系统管理模块进行,然后,我就开始相互依赖,然后出现这样的问题: “Could ...