Come faccio a creare alcuni vasetti EJB in un progetto di costruzione Gradle?
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.
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