Comment puis-je créer plusieurs pots ejb dans un projet de construction Gradle?
Question
J'ai une construction multi-projets et dans chacun des projets que j'ai plusieurs paquets dans l'arbre principal src qui doivent être emballés séparément du reste du src comme objets EJB individuels:
com/foo/ejb/ejb1
com/foo/ejb/ejb2
...
Il peut y avoir un nombre arbitraire de ces EJBs dans chaque projet (0 ou plusieurs). Ma question est, comment puis-je créer une tâche qui peut, par projet, pot chacun d'entre eux comme des objets séparés après la compilation régulière / pot? C'est à dire. Donc, je me retrouve avec des objets suivants pour chaque projet:
project.jar (usual Java classes)
ejb1.jar (MyEjb1Home/Remote/Bean.class, META_INF/[descriptors])
ejb2.jar (MyEjb2Home/Remote/Bean.class, META_INF/[descriptors])
...
La tâche (s) doit être quelque chose que je peux partager à chaque projet (donc probablement défini dans le projet racine) et qui trouvera automatiquement src EJB et générer un pot pour chacun, sans avoir à définir explicitement les EJBs dans les sous-projets ( mais peut-être un ensemble de propriétés « containsEjbs » pour affiner les sous-projets qui ont EJBs).
Je pense le long des lignes de l'aide d'un arborescence de fichiers pour saisir le paquet src puis itérer et ing Jar (com.foo.ejb *.) - mais sa façon de faire ce pot-ing dans le cadre des tâches qui est ce que je vais avoir du mal avec.
Merci pour toute aide, Chris.
La solution 2
J'ai fini par faire ce qui suit. Dans [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" )
}
}
}
}
Donc, si tous les projets ont une propriété « containsEjbs = true », puis une des tâches est ajouté pour chaque paquet ejb trouvé le cadre du projet « / com / foo / ejb » dans chaque respectif (sous). Nous stockons META-INF avec des descripteurs dans la même arborescence source en cours, donc il peut y avoir quelques réglages nécessaires à votre configuration.
Autres conseils
Vous pouvez simplement définir une nouvelle tâche de type: pot
task('ejb1', type: Jar) {
//describe jar contents here as a CopySpec
}
Cette tâche doit être automatiquement exécuté dans la phase de construction « assembler ». Description complète des fonctions disponibles est http: // www .gradle.org / 0,9-rc-1 / documents / userguide / userguide_single.html # artifact_management