如何在 Gradle 构建项目中创建多个 ejb jar?

发布于 2024-09-17 10:01:42 字数 668 浏览 2 评论 0原文

与 src 的其余部分分开打包为单独的 EJB 工件:

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

我有一个多项目构建,并且在每个项目中,主 src 树中都有几个包,这些包需要 每个项目(0 个或多个)。 我的问题是,如何创建一个任务,可以在每个项目中在常规编译/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 ,这就是我遇到麻烦了。

感谢您的帮助,克里斯。

I have a multi-project build and in each of the projects I have several packages in the main src tree which need to be packaged up separately from the rest of the src as individual EJB artifacts:

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

There can be an arbitrary number of these EJBs in each project (0 or several).
My question is, how do I create a task that can, per project, Jar each of these as separate artifacts after the regular compile/jar? I.e. So I end up with following artifacts for each project:

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

The task(s) should be something I can share to each project (so probably defined in root project) and that will automatically find EJB src and generate a jar for each, without having to explicitly define the EJBs in the subprojects (but perhaps a property set "containsEjbs" to narrow down subprojects that have EJBs).

I'm thinking along the lines of using a filetree to grab the src package (com.foo.ejb.*) and then iterating and Jar-ing - but its how to do this Jar-ing in the context of Tasks which is what I'm having trouble with.

Thanks for any help, Chris.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

挖鼻大婶 2024-09-24 10:01:42

您可以简单地定义一个类型为: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

You can simply define a new Task of Type: Jar

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

This task should automatically be run in the 'assemble' build phase. Full description of features available is at http://www.gradle.org/0.9-rc-1/docs/userguide/userguide_single.html#artifact_management

稀香 2024-09-24 10:01:42

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

I ended up doing the following. In [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" )
                }
            }
        }
    }

So if any projects have a property 'containsEjbs=true', then a tasks is added for each ejb package found under '/com/foo/ejb' in each respective (sub)project. We store META-INF with descriptors in same source tree as classes, so there may be tweaks needed for your set up.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文