The projects in the reactor contain a cyclic reference
图?中?模?块?C依?赖?于?模?块?B,模?块?B依?赖?于?模?块?A,而?模?块?A又?依?赖?于?模?块?C,这?样?就?出?现?了?相?互?依?赖?情?况?,如?果?运?行?mvn compile会?出?现?如?下?错?误?:
这?样?就?产?生?了?一?个?合?并?模?块?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模?型?
<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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |