Como faço para criar vários frascos de EJB em um projeto de construção gradle?

StackOverflow https://stackoverflow.com/questions/3627791

  •  26-09-2019
  •  | 
  •  

Pergunta

Eu tenho uma construção com vários projetos e, em cada um dos projetos, tenho vários pacotes na árvore SRC principal que precisam ser embalados separadamente do restante do SRC como artefatos individuais de EJB:

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

Pode haver um número arbitrário desses EJBs em cada projeto (0 ou vários). Minha pergunta é: como faço para criar uma tarefa que possa, por projeto, jarre cada um deles como artefatos separados após a compilação/jar regular? Ou seja, eu acabo com os seguintes artefatos para cada projeto:

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

As tarefas devem ser algo que eu possa compartilhar em cada projeto (provavelmente definido no projeto raiz) e isso encontrará automaticamente o EJB SRC e gerará um frasco para cada um, sem ter que definir explicitamente os EJBs nos subprojetos (mas talvez um Definir a propriedade "CONTESSEJBS" para restringir subprojetos que possuem EJBs).

Estou pensando na linha de usar um filetree para pegar o pacote SRC (com.foo.ejb. Estou tendo problemas com.

Obrigado por qualquer ajuda, Chris.

Foi útil?

Solução 2

Acabei fazendo o seguinte. Em [raiz] /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" )
                }
            }
        }
    }

Portanto, se algum projeto tiver uma propriedade 'contesejbs = true', será adicionada tarefas para cada pacote EJB encontrado em '/com/foo/ejb' em cada projeto (sub) respectivo. Armazenamos meta-inf com descritores na mesma árvore de origem das classes, para que possa haver ajustes necessários para a sua configuração.

Outras dicas

Você pode simplesmente definir uma nova tarefa do tipo: jar

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

Esta tarefa deve ser executada automaticamente na fase de construção 'montagem'. Descrição completa dos recursos disponíveis está em http://www.gradle.org/0.9-rc-1/docs/userguide/userguide_single.html#artifact_management

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top