解決Maven項目相互依賴/循環依賴/雙向依賴的問題

解決Maven項目相互依賴/循環依賴/雙向依賴的問題

博客分類: 

 

,模,如使​Maven,因Maven,如​Maven​Maven​:  

1. A​B​C​ 
http://dl.iteye.com/upload/picture/pic/120084/1239616b-1910-31ff-8870-eae5d07de62f.jpg 


​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​ 
http://dl.iteye.com/upload/picture/pic/120086/3bd3fc51-5eaa-3b8b-bc36-8f46b2ea3761.jpg 


​D,我,然​A​B​C​D,這​A​B​C 
3. ​D​A​B​C​ 
http://dl.iteye.com/upload/picture/pic/120088/fb766471-f6b3-3972-a672-c8e547a04a91.jpg 

​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代碼  

  1. <project xmlns="http://maven.apache.org/POM/4.0.0"  
  2.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  3.     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  
  4.     <parent>  
  5.         <groupId>org.kuuyee.sample</groupId>  
  6.         <artifactId>sample-parent</artifactId>  
  7.         <version>1.0-SNAPSHOT</version>  
  8.         <relativePath>../../pom.xml</relativePath>  
  9.     </parent>  
  10.     <modelVersion>4.0.0</modelVersion>  
  11.     <groupId>org.kuuyee.sample</groupId>  
  12.     <artifactId>module-D</artifactId>  
  13.     <version>1.0-SNAPSHOT</version>  
  14.     <packaging>jar</packaging>  
  15.     <name>module-D</name>  
  16.     <url>http://maven.apache.org</url>  
  17.     <properties>  
  18.         <project.build.sourceEncoding>  
  19.             UTF-8  
  20.         </project.build.sourceEncoding>  
  21.         <module.a.src>../../module/module-A/src/main/java</module.a.src>  
  22.         <module.b.src>../../module/module-B/src/main/java</module.b.src>  
  23.         <module.c.src>../../module/module-C/src/main/java</module.c.src>  
  24.     </properties>  
  25.     <build>  
  26.         <plugins><!-- 解決模塊相互依賴,綜合所有相互依賴代碼統一編譯 -->  
  27.             <plugin>  
  28.                 <groupId>org.codehaus.mojo</groupId>  
  29.                 <artifactId>build-helper-maven-plugin</artifactId>  
  30.                 <executions>  
  31.                     <execution>  
  32.                         <id>add-source</id>  
  33.                         <phase>generate-sources</phase>  
  34.                         <goals>  
  35.                             <goal>add-source</goal>  
  36.                         </goals>  
  37.                         <configuration>  
  38.                             <sources>  
  39.                                 <source>${module.a.src}</source>  
  40.                                 <source>${module.b.src}</source>  
  41.                                 <source>${module.c.src}</source>  
  42.                             </sources>  
  43.                         </configuration>  
  44.                     </execution>  
  45.                 </executions>  
  46.             </plugin>  
  47.         </plugins>  
  48.     </build>  
  49.     <dependencies>  
  50.         <dependency>  
  51.             <groupId>junit</groupId>  
  52.             <artifactId>junit</artifactId>  
  53.             <version>3.8.1</version>  
  54.             <scope>test</scope>  
  55.         </dependency>  
  56.     </dependencies>  
  57. </project>  


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

maven
處理循環依賴 
 在多maven工程的項目裏,如果工程間存在循環依賴,構建就會報錯。本文介紹一下循環依賴要怎麼處理 
   
  1、什麼是循環依賴 
   
  如果工程A依賴工程B,工程B又依賴工程A,就會形成循環依賴。或者A依賴BB依賴CC依賴A,也是循環依賴 
   
  總的來說,在畫出工程依賴圖之後,如果發現工程間的依賴連線形成了一個有向循環圖,則說明有循環依賴的現象 
   
  如果循環依賴發生在工程之間,則會影響構建,因爲maven不知道應該先編譯哪個工程。如果循環依賴發生在同一個工程的模塊之間,雖然不影響編譯,但是也是一種不好的實踐,說明模塊的設計有問題,應該避免 
   
  如果在模塊內部,有幾個類互相調用的話,我覺得可能是正常的。比如觀察者模式裏面,ObserverObservable就是互相依賴的 
   
  2、怎麼解決循環依賴 
   
  目前知道有2個辦法可以解決 
   
  第一個辦法是用build-helper-maven-plugin插件來規避。比如A依賴BB依賴CC依賴A的情況。這個插件提供了一種規避措施,即臨時地將工程ABC合併成一箇中間工程,編譯出臨時的模塊D。然後ABC再分別依賴臨時模塊D進行編譯 
   
  這種方法可以解決無法構建的問題,但是隻是一個規避措施,工程的依賴關係依然是混亂的 
   
  第二個辦法是通過重構,從根本上消除循環依賴 
   
  3、如何重構 
   
  目前也知道2個重構的思路 
   
  第一個辦法是平移,比如AB互相依賴,那麼可以將B依賴A的那部分代碼,移動到工程B中,這樣一來,B就不需要繼續依賴A,只要A依賴B就可以了,從而消除循環依賴 
   
  第二個辦法是下移,比如AB互相依賴,同時它們都依賴C,那麼可以將BA相互依賴的那部分代碼,移動到工程C裏,這樣一來,AB相互之間都不依賴,只繼續依賴C,也可以消除循環依賴 
   
  這兩種重構方式都是可行的,具體採用哪種方式要根據實際情況來判斷。不管採取哪種方式,都需要對代碼進行修改,有時候並不是那麼容易的 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章