Come faccio a creare alcuni vasetti EJB in un progetto di costruzione Gradle?

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

  •  26-09-2019
  •  | 
  •  

Domanda

ho un accumulo multi-progetto e in ciascuno dei progetti che ho diversi pacchetti nell'albero src principale che devono essere confezionati separatamente dal resto del src come singoli manufatti EJB:

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

Ci può essere un numero arbitrario di questi bean in ogni progetto (0 o più). La mia domanda è: come si crea un compito che può, per progetto, vaso ciascuno di questi come artefatti separati dopo la regolare compilazione / vaso? Cioè Così finisco con i seguenti manufatti per ogni progetto:

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

Il compito (s) dovrebbe essere qualcosa che posso condividere a ciascun progetto (quindi probabilmente definita nel progetto di primo livello) e che troverà automaticamente EJB src e generare un barattolo per ciascuno, senza dover definire esplicitamente le EJB nei sottoprogetti ( ma forse un insieme di proprietà "containsEjbs" per restringere sottoprogetti che hanno EJB).

Sto pensando lungo le linee di utilizzare un FileTree per afferrare il pacchetto src e poi l'iterazione e Jar-ing (com.foo.ejb *.) - ma la sua come fare questo Jar-ing nel contesto dei compiti che è quello che sto avendo problemi con.

Grazie per qualsiasi aiuto, Chris.

È stato utile?

Soluzione 2

ho finito per fare quanto segue. 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" )
                }
            }
        }
    }

Quindi, se i progetti hanno una proprietà 'containsEjbs = true', poi si aggiunge un'attività per ogni pacchetto ejb trovato sotto '/ com / foo / ejb' in ogni rispettivo progetto (sotto). Noi registriamo META-INF con descrittori stessa struttura di origine come classi, così ci possono essere modifiche necessarie per il set up.

Altri suggerimenti

Si può semplicemente definire un nuovo task di tipo: Jar

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

Questa operazione deve essere eseguita automaticamente nella fase di 'montare' costruire. Descrizione completa di funzioni disponibili è a http: // www .gradle.org / 0.9-rc-1 / docs / userguide / userguide_single.html # artifact_management

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top