Как мне создать несколько банок EJB в проекте сборки Gradle?

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

  •  26-09-2019
  •  | 
  •  

Вопрос

У меня есть многопроектная сборка, и в каждом из проектов у меня есть несколько пакетов в основном дереве SRC, которое нужно упаковано отдельно от остальной части SRC в качестве отдельных артефактов EJB:

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

В каждом проекте может быть произвольный номер этих EJBS (0 или несколько). Мой вопрос в том, как мне создать задачу, которая может по проекту, банку каждый из них как отдельные артефакты после регулярного компиляции / банки? То есть так я в конечном итоге следую артефактам для каждого проекта:

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

Задача (ей) должно быть чем-то, что я могу поделиться в каждом проекте (так, вероятно, определено в корневом проекте), и это автоматически найдет EJB SRC и генерирует банку для каждого, без необходимости явного определения EJBS в подпроектах (но, возможно, Свойство Установите «Boistsejbs», чтобы сузить подпроекты, которые имеют EJBS).

Я думаю по линии использования филетра, чтобы захватить пакет SRC (com.foo.ejb. *), А затем итерация и Jar-ing - но его, как это сделать JAR-ING в контексте задач, что У меня проблемы с.

Спасибо за любую помощь, Крис.

Это было полезно?

Решение 2

Я закончил сделать следующее. В [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" )
                }
            }
        }
    }

Таким образом, если какие-либо проекты имеют свойство «BOINTSEJBS = TRUE», то добавляются задачи для каждого пакета EJB, найденного под «/ COM / FOO / EJB» в каждом соответствующем (суб) проекте. Мы храним мета-инф с дескрипторами в том же дереве источника в качестве классов, поэтому для вашей настройки необходимы настройки.

Другие советы

Вы можете просто определить новую задачу типа: JAR

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

Эта задача должна автоматически работать в фазе сборки «сборки». Полное описание доступных функций в http://www.gradle.org/0.9-RC-1/docs/userguide/userguide_single.html#artifact_management.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top