2010-09-02 135 views
0

我有一個多項目構建和每個項目我都在主SRC樹幾個包這就需要從SRC作爲單獨的EJB工件的其餘部分分開打包:如何在Gradle構建項目中創建幾個ejb jar?

com/foo/ejb/ejb1 
com/foo/ejb/ejb2 
... 

有可以是每個項目中任意數量的這些EJB(0或幾個)。 我的問題是,如何創建一個任務,可以在每個項目中將常規編譯/ jar之後的每個jar作爲單獨的工件?即所以,我結束了對每個項目以下項目:

project.jar (usual Java classes) 
ejb1.jar (MyEjb1Home/Remote/Bean.class, META_INF/[descriptors]) 
ejb2.jar (MyEjb2Home/Remote/Bean.class, META_INF/[descriptors]) 
... 

的任務(一個或多個)應該是我可以分享到每一個項目(因此可能是在根項目中定義),而且會自動查找EJB src和生成而不必在子項目中顯式定義EJB(但可能是一個屬性集「containsEjbs」以縮小具有EJB的子項目)。

我在思考如何使用文件樹來抓取src包(com.foo.ejb。*),然後迭代和Jaring - 但它如何在上下文中執行此Jaring這是我遇到麻煩的任務。

謝謝你的幫助,克里斯。

回答

0

我最終做了以下工作。在[根] /build.gradle:

afterEvaluate { project -> 
    if (project.hasProperty('containsEjbs')) 
    { 
     def basePath = '/com/foo/ejb' 
     def classesDir = project.sourceSets.main.classesDir 
     def ejbRootClassesDir = file(classesDir.getPath() + basePath) 
     def srcFileDirs = project.sourceSets.main.java.srcDirs.collect { file(it.getPath() + basePath) }.findAll { it.exists() && it.isDirectory() } 
     def ejbDirs = srcFileDirs.collect { it.listFiles() }.flatten() 
     def ejbs = ejbDirs.findAll { it.listFiles().findAll { f -> f.name == 'META-INF'} } 
     ejbs.each { file -> 
      task "jarEjbFor_$file.name" (type: Jar, dependsOn:classes) { 
       baseName = "$file.name" 
       classifier = 'ejb' 
       from fileTree(file).include('META-INF/**') 
       into ("$basePath/$file.name") 
       { 
        from fileTree(ejbRootClassesDir.getPath() + "/$file.name") 
       } 
      } 
     } 
    } 

因此,如果任何項目在每個的屬性「containsEjbs =真」,則任務被添加爲屬於「/ COM /富/ EJB」中找到的每個EJB包各自的(子)項目。我們將META-INF與描述符一起存儲在與類相同的源代碼樹中,因此可能會對您的設置進行調整。

+0

如果有更好的做法,請告訴我:) – Chris 2010-09-30 13:50:11

0

您可以簡單地定義類型的新任務:罐

task('ejb1', type: Jar) { 
    //describe jar contents here as a CopySpec 
} 

這個任務應自動在「組裝」建造階段運行。可用功能的完整說明是http://www.gradle.org/0.9-rc-1/docs/userguide/userguide_single.html#artifact_management

+0

thx,但是這並沒有描述如何爲每個項目中的每個任意命名的ejb包創建單獨的Jars。也許我不夠清楚 - 我想要這個,而不必在每個項目中手動指定Jar任務,即。一個自動查找ejb包/目錄然後爲其中的每個添加任務的例程。因此,我可以與所有項目共享此邏輯,而無需爲每個項目編寫特定的任務。我現在變得非常接近,但不知道它的正確方法... – Chris 2010-09-08 15:01:10

+0

如果結構在每個子項目中都是一致的,您可以在父模塊中配置一次,並且它將被所有人繼承。您還可以根據需要使用簡單的閉包語法修改/增強每個子項目中的特定配置,即ejb1 {//配置在子模塊中進入} – TheKaptain 2010-09-08 20:25:04

+0

是的,這就是問題的一部分,結構*不是*一致的就底層包裝而言。最上面的部分是:com.foo.ejb - 但是這之後的包可以是任何東西,例如com.foo.ejb.excellentejb和com.foo.ejb.differentejb。我不想在子項目中定義任何特定的東西,只是在根項目中定義的一個繼承的任務(或一組生成的任務 - 我正在介紹的方向)。 – Chris 2010-09-10 08:18:12

相關問題