Как мне создать несколько jar-файлов ejb в проекте сборки Gradle? - PullRequest
0 голосов
/ 02 сентября 2010

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

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

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

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 и сгенерирует jar для каждого без необходимости явного определения EJB в подпроектах ( но, возможно, набор свойств "containsEjbs" сужает подпроекты, которые имеют EJB).

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

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

Ответы [ 2 ]

0 голосов
/ 30 сентября 2010

В итоге я сделал следующее. В [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" )
                }
            }
        }
    }

Таким образом, если у какого-либо проекта есть свойство 'containsEjbs = true', то задачи добавляются для каждого пакета ejb, найденного в '/ com / foo / ejb' в каждом соответствующем (под) проекте. Мы храним META-INF с дескрипторами в том же исходном дереве, что и классы, поэтому для вашей настройки могут потребоваться изменения.

0 голосов
/ 07 сентября 2010

Вы можете просто определить новую задачу типа: 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...