2012-01-26 79 views
19

我最近開始使用Gradle並替換現有的基於Maven的項目。過去,我在使用Maven處理多模塊構建時遇到了很多問題。在處理多模塊組件時,Gradle一直呼吸着新鮮空氣,但它還不完美。Gradle多模塊項目設置

我有我的項目的以下文件夾佈局:

-- Projects 
---- EnterpriseApp1 
------ EarProject 
-------- build.gradle 
------ EjbProject 
-------- build.gradle 
------ WarProject 
-------- build.gradle 
------ properties.gradle 
------ build.gradle 
---- CommonLib 
------ build.gradle 
---- ClientApplication 
------ build.gradle 

我遇到的問題是,「EnterpriseApp1」和「ClientApplication」既取決於CommonLib項目。我不知道如何配置我的「EnterpriseApp1」構建文件以使用CommonLib項目作爲「EjbProject」的依賴項。我已經接近完成這項工作,但尚未完成工作。我通過複製「EnterpriseApp1」中的CommonLib文件夾獲得了成功,但這不是一個長期的解決方案。

下面是「EnterpriseApp1」我目前properties.gradle文件:

include "EarProject", "EjbProject", "WarProject" 
includeFlat "CommonLib" 

按照搖籃文檔中的「settings.gradle」文件中的「includeFlat」命令將包括在同一槓桿的項目「settings.gradle」文件所在的文件夾(所需行爲)。

EnterpriseApp1 /的build.gradle文件:

subprojects { 
    apply plugin: 'java' 

    sourceCompatibility = 1.6 
    group = 'org.example' 
    version = '1.0-SNAPSHOT' 

    repositories { 
     mavenCentral() 
     ... 
    } 

    dependencies { 

    }  
} 

EnterpriseApp1/EjbProject /的build.gradle:

apply plugin: 'java' 

sourceCompatibility = 1.6 

repositories { 
    mavenCentral() 
    ... 
} 

dependencies { 
    compile project(':CommonLib') 

    compile group: 'org.restlet.jee', name: 'org.restlet', version: '2.0.11' 
    compile group: 'ma.glasnost.orika', name: 'orika-core', version: '1.0' 
    ... 
    compile group: 'javax.jmdns', name: 'jmdns', version: '3.4.1' 
} 

當我從EnterpriseApp1文件夾執行 「gradle這個乾淨的構建」 所有的依賴下載如預期的那樣,項目開始編譯(包括CommonLib項目),但是EjbProject項目在構建期間失敗,因爲它缺少CommonLib jar引用。 Gradle不夠聰明(或者我完全不知道;))將我的EjbProject配置爲使用從CommonLib項目構建階段生成的Jar。

對於漫長而複雜的設置,我表示歉意。我一直在試圖解決這個問題一段時間,但幾乎沒有想法。我非常感謝社區的任何幫助。

謝謝!

+0

顯示的目錄佈局的縮進有些問題。這是一個構建,其中CommonLib和ClientApplication與EnterpriseApp1位於同一目錄級別,其他項目級別較低? (這將是一個非常罕見的佈局,通常是或者) –

+0

此外,Gradle如何知道CommonLib是EjbProject的依賴關係,因爲您沒有在'EjbProject/build.gradle'中指定這樣的依賴關係? –

+0

您是否打算說:這是我當前的「EnterpriseApp1」中的_settings.gradle_文件 –

回答

7

您選擇的目錄佈局已經暗示了一個很好的解決方案。我建議有三個獨立的版本:EnterpriseApp1,CommonLibClientApplication。我會將CommonLib發佈到Maven或Ivy存儲庫,以便其他兩個構建可以從那裏使用它。對於本地開發,您可以將CommonLib發佈到本地Maven回購(最簡單)或基於文件的常春藤回購。

+0

謝謝彼得!這就是我想我可以作爲最後的手段,但我不想使用本地/遠程回購。你知道這是否可以通過Gradle完成?或者你認爲這首先不是一個好習慣? –

+2

如果'EnterpriseApp1'和'ClientApplication'是具有不同開發和發佈週期的不同應用程序,則構建應反映這一點。您可以將'CommonLib'發佈爲'EnterpriseApp1'版本的一部分,但是這仍然需要一個版本庫,並且當'ClientApplication'需要更改'CommonLib'時會使問題複雜化。或者,如果所有代碼都位於同一個源代碼庫中,則可以有兩個代碼,這兩個代碼都包含'CommonLib'。或者,如果開發/發佈週期相同,則可以擁有一個大型版本,在這種情況下,您不需要回購。 –

+0

有道理。謝謝彼得! –