0

私はマルチプロジェクト ビルドを持っており、各プロジェクトにはメインの 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 を明示的に定義する必要なく、自動的に EJB src を見つけてそれぞれの jar を生成します (ただし、おそらくプロパティを「containsEjbs」に設定して、EJB を持つサブプロジェクトを絞り込みます)。

私は、ファイルツリーを使用して src パッケージ (com.foo.ejb.*) を取得し、反復して Jar-ing する方法に沿って考えていますが、Tasks のコンテキストでこの Jar-ing を行う方法は何ですか?と困っています。

助けてくれてありがとう、クリス。

4

2 に答える 2

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=true」がある場合、それぞれの (サブ) プロジェクトの「/com/foo/ejb」の下にある各 ejb パッケージにタスクが追加されます。META-INF は記述子とともにクラスと同じソース ツリーに保存されるため、設定に微調整が必​​要になる場合があります。

于 2010-09-30T13:49:43.733 に答える
0

Type: Jar の新しい Task を定義するだけです。

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 に答える