2010-09-02 2 views
0

je 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:Comment créer plusieurs fichiers ejb dans un projet de compilation Gradle?

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

Il peut être un nombre arbitraire de ces EJB dans chaque projet (0 ou plusieurs). Ma question est, comment puis-je créer une tâche qui, par projet, Jar chacun de ces objets comme des artefacts séparés après la compilation/jar régulière? 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 jar pour chaque, sans avoir à définir explicitement les EJB dans les sous-projets (mais peut-être un ensemble de propriétés "containsEjbs" pour affiner les sous-projets qui ont des EJB).

Je pense à l'utilisation d'un filetree pour récupérer le paquetage src (com.foo.ejb. *), Puis à l'itération et au Jar-ing - mais comment le faire dans le contexte de Tâches qui est ce que j'ai des problèmes avec.

Merci pour toute aide, Chris.

Répondre

0

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 des projets ont une propriété 'containsEjbs = true', puis une des tâches est ajouté pour chaque paquet ejb trouvée sous '/ com/foo/ejb' dans chaque (sous) projet respectif. Nous stockons META-INF avec des descripteurs dans la même arborescence source que les classes, il est donc possible que des ajustements soient nécessaires pour votre configuration.

+0

S'il y a une façon plus élégante de le faire, faites le moi savoir :) – Chris

0

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 exécuté automatiquement dans la phase « assembler » construire. Description complète des fonctionnalités disponibles est à http://www.gradle.org/0.9-rc-1/docs/userguide/userguide_single.html#artifact_management

+0

thx, mais cela ne décrit pas comment créer des fichiers JAR distincts pour chaque paquet ejb arbitrairement nommé dans chaque projet. Peut-être que je n'étais pas assez clair - je veux cela sans avoir à spécifier manuellement les tâches Jar dans chaque projet, à savoir. une routine qui trouve automatiquement les paquets/répertoires ejb, puis ajoute des tâches pour chacun d'eux. Ainsi, je peux partager cette logique avec tous les projets sans avoir à écrire des tâches spécifiques pour le faire pour chacun. Je suis assez proche maintenant mais je ne suis pas sûr que c'est la bonne façon ... – Chris

+0

Si la structure est cohérente à travers chacun des sous-projets, vous pouvez le configurer une fois dans un module parent et il sera hérité par tous. Vous pouvez également modifier/améliorer la configuration spécifique dans chacun des sous-projets selon la syntaxe de fermeture simple, c'est-à-dire ejb1 {// la configuration va ici dans un sous-module} – TheKaptain

+0

Ouais c'est une partie du problème, la structure * n'est pas * cohérente en ce qui concerne le paquet inférieur. La partie supérieure est: com.foo.ejb - mais alors le paquet sous ceci pourrait être n'importe quoi, par ex. com.foo.ejb.excellentejb et com.foo.ejb.differentejb. Je ne veux pas définir quelque chose de spécifique dans les sous-projets, juste une tâche héritée (ou un ensemble de tâches générées - la direction vers laquelle je me dirige) définie dans le projet racine. – Chris

Questions connexes