Frage

Ich habe ein Multi-Projekt zu bauen und in jedem der Projekte habe ich mehrere Pakete im Haupt src Baum, der vom Rest des src als einzelne EJB Artefakte separat verpackt zu werden brauchen:

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

Es kann eine beliebige Anzahl dieser EJBs in jedem Projekt (0 oder mehrere) sein. Meine Frage ist, wie erstelle ich eine Aufgabe, die, pro Projekt, je eine Dose dieser als separates Artefakte nach der regulären Kompilierung / jar? D. h Also habe ich mit folgenden Artefakte für jedes Projekt am Ende:

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

Die Aufgabe (n) sollte etwas, was ich zu jedem Projekt gemeinsam nutzen kann (so wahrscheinlich in Stammprojekt definiert ist), und das wird automatisch EJB src und erzeugt ein Glas für jeden, ohne dass explizit definiert die EJBs in den Teilprojekten finden ( aber vielleicht ein Objekt „containsEjbs“ Subprojekte zu verengen, die EJBs haben).

Ich denke, entlang der Linien einen filetree mit dem src-Paket zu packen und dann iteriert und Jar-ing (com.foo.ejb *.) - aber sein, wie dies zu tun Jar-ing im Rahmen der Aufgaben das ist, was ich habe Probleme mit.

Vielen Dank für jede Hilfe, Chris.

War es hilfreich?

Lösung 2

ich am Ende der folgende tun. 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" )
                }
            }
        }
    }

Also, wenn alle Projekte haben eine Eigenschaft ‚containsEjbs = true‘, dann ein Aufgabe für jedes ejb-Paket hinzugefügt wird, gefunden unter ‚/ com / foo / ejb‘ in der jeweiligen (Teil-) Projekt. Wir speichern META-INF mit Deskriptoren in gleichem Quellbaum wie Klassen, so können es zwickt für die Einrichtung benötigt werden.

Andere Tipps

Sie können einfach eine neue Aufgabe von Typ definieren: Glas

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

sollte diese Aufgabe automatisch in der ‚montieren‘ BUILD-Phase ausgeführt werden. Ausführliche Beschreibung der verfügbaren Funktionen ist unter http: // www .gradle.org / 0,9-rc-1 / docs / -Nutzerhandbuch / userguide_single.html # artifact_management

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top