多模塊的maven工程,有時候由于設計的不合理或者需求的變更。會導致模塊之間產生循環依賴,編譯的時候會報如下的錯誤:
[INFO] Scanning for projects... [ERROR] The projects in the reactor contain a cyclic reference: Edge between .....
重構肯定是需要的,把2個模塊中都用到部分移到common子模塊中。2個模塊都依賴common中的代碼,這樣就可以消除2個模塊的相互引用了。
也可以使用build-helper-maven-plugin插件,比如A依賴B,B依賴C,C依賴A的情況。這個插件提供了一種規避措施,即臨時地將工程A、B、C合并成一個中間工程,編譯出臨時的模塊D。然后A、B、C再分別依賴臨時模塊D進行編譯 。
有IOC機制的工程,可以如下的解決,我碰到的問題就是這樣解決了。
出問題的工程是maven的多模塊工程。
B模塊已經依賴了A模塊,但是現在A模塊又需要使用B模塊中的相關方法。
可以在A模塊中定義一個接口,由于B模塊依賴A模塊,所以B模塊可以直接實現該接口,然后A模塊中通過接口聲明并注入B模塊中的實例即可。
我使用的是HK2中的@Contract和@Service。
同樣是B模塊已經依賴了A模塊,但是現在A模塊又需要使用B模塊中的相關方法這個問題,還可以如下解決。
一般maven的多模塊工程,會有一個common模塊,可以把接口定義在common模塊,A模塊中實現了接口,B模塊注入該接口的實現。
maven編譯時會先編譯common模塊,再編譯B模塊,再編譯A模塊。
關于build-helper-maven-plugin插件和maven循環依賴,可以看一下https://hck.iteye.com/blog/1728329。