0

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

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 - 但它如何在 Tasks 的上下文中执行此 Jar-ing 这是什么我有麻烦。

谢谢你的帮助,克里斯。

4

2 回答 2

0

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

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

于 2010-09-07T19:43:41.333 回答
0

我最终做了以下事情。在 [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 存储在与类相同的源树中,因此您的设置可能需要进行调整。

于 2010-09-30T13:49:43.733 回答