我有一个多项目构建,在每个项目中,我在主src树中有几个包,需要与src的其余部分分开打包作为单独的EJB工件:
com/foo/ejb/ejb1
com/foo/ejb/ejb2
...
每个项目中可以有任意数量的这些EJB(0或几个)。 我的问题是,如何在每个项目中创建一个任务,可以在常规编译/ 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的子项目。
我正在考虑使用filetree来获取src包(com.foo.ejb。*)然后迭代和Jaring - 但是它如何在Tasks的上下文中进行Jaring这就是我遇到的麻烦。
感谢您的帮助,Chris。
答案 0 :(得分:0)
您可以简单地定义一个新的类型任务: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
答案 1 :(得分:0)
我最终做了以下事情。在[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',则为每个相应(子)项目中的'/ com / foo / ejb'下的每个ejb包添加一个任务。我们将META-INF与描述符一起存储在与类相同的源树中,因此可能需要对您的设置进行调整。