Groovy 如何在Gradle构建项目中创建几个ejb JAR?

Groovy 如何在Gradle构建项目中创建几个ejb JAR?,groovy,gradle,Groovy,Gradle,我有一个多项目构建,在每个项目中,我在主src树中有几个包,这些包需要作为单独的EJB构件与src的其余部分分开打包: com/foo/ejb/ejb1 com/foo/ejb/ejb2 ... 每个项目中可以有任意数量的EJB(0个或多个)。 我的问题是,如何创建一个任务,在常规编译/Jar之后,每个项目都可以将它们作为单独的工件进行Jar?也就是说,我最终为每个项目提供了以下工件: project.jar (usual Java classes) ejb1.jar (MyEjb1Home

我有一个多项目构建,在每个项目中,我在主src树中有几个包,这些包需要作为单独的EJB构件与src的其余部分分开打包:

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并为每个项目生成一个jar,而不必在子项目中显式定义EJB(但可能是一个属性集“containsEjbs”来缩小有EJB的子项目)

我一直在考虑使用一个文件树来获取src包(com.foo.ejb.*),然后进行迭代和Jar-ing——但是在任务上下文中如何进行Jar-ing,这正是我遇到的问题


谢谢你的帮助,克里斯。

你可以简单地定义一个新的任务类型:Jar

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

此任务应在“组装”构建阶段自动运行。可用功能的完整描述见

我最后做了以下工作。在[root]/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=true”,那么将为每个(子)项目中在“/com/foo/ejb”下找到的每个ejb包添加一个任务。我们将META-INF和描述符存储在与类相同的源代码树中,因此可能需要对您的设置进行调整。

thx,但这并没有描述如何为每个项目中任意命名的ejb包创建单独的JAR。也许我不够清楚-我希望这样做,而不必在每个项目中手动指定Jar任务,即自动查找ejb包/目录,然后为每个包/目录添加任务的例程。因此,我可以与所有项目共享此逻辑,而不必为每个项目编写特定的任务。我现在已经非常接近了,但不确定这是正确的方式……如果每个子项目的结构都是一致的,那么您可以在父模块中配置它一次,并且它将被所有子项目继承。您还可以根据需要使用简单的闭包语法修改/增强每个子项目中的特定配置,即ejb1{//配置在子模块中。}是的,这是问题的一部分,就底层包而言,结构不一致。最上面的部分是:com.foo.ejb-但是这个包下的包可以是任何东西,例如com.foo.ejb.excellentejb和com.foo.ejb.differencejb。我不想在子项目中定义任何特定的内容,只想在根项目中定义一个继承的任务(或一组生成的任务-我的前进方向)。如果有更优雅的方法,请告诉我:)