Как мне создать несколько банок EJB в проекте сборки Gradle?
Вопрос
У меня есть многопроектная сборка, и в каждом из проектов у меня есть несколько пакетов в основном дереве 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.