2010-09-02 83 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

相关问题