Comment puis-je créer plusieurs pots ejb dans un projet de construction Gradle?

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

  •  26-09-2019
  •  | 
  •  

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.

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top