Groovy 如何在Gradle构建项目中创建几个ejb JAR?
我有一个多项目构建,在每个项目中,我在主src树中有几个包,这些包需要作为单独的EJB构件与src的其余部分分开打包:Groovy 如何在Gradle构建项目中创建几个ejb JAR?,groovy,gradle,Groovy,Gradle,我有一个多项目构建,在每个项目中,我在主src树中有几个包,这些包需要作为单独的EJB构件与src的其余部分分开打包: com/foo/ejb/ejb1 com/foo/ejb/ejb2 ... 每个项目中可以有任意数量的EJB(0个或多个)。 我的问题是,如何创建一个任务,在常规编译/Jar之后,每个项目都可以将它们作为单独的工件进行Jar?也就是说,我最终为每个项目提供了以下工件: project.jar (usual Java classes) ejb1.jar (MyEjb1Home
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,这正是我遇到的问题
谢谢你的帮助,克里斯。你可以简单地定义一个新的任务类型:Jar
task('ejb1', type: Jar) {
//describe jar contents here as a CopySpec
}
此任务应在“组装”构建阶段自动运行。可用功能的完整描述见我最后做了以下工作。在[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和描述符存储在与类相同的源代码树中,因此可能需要对您的设置进行调整。thx,但这并没有描述如何为每个项目中任意命名的ejb包创建单独的JAR。也许我不够清楚-我希望这样做,而不必在每个项目中手动指定Jar任务,即自动查找ejb包/目录,然后为每个包/目录添加任务的例程。因此,我可以与所有项目共享此逻辑,而不必为每个项目编写特定的任务。我现在已经非常接近了,但不确定这是正确的方式……如果每个子项目的结构都是一致的,那么您可以在父模块中配置它一次,并且它将被所有子项目继承。您还可以根据需要使用简单的闭包语法修改/增强每个子项目中的特定配置,即ejb1{//配置在子模块中。}是的,这是问题的一部分,就底层包而言,结构不一致。最上面的部分是:com.foo.ejb-但是这个包下的包可以是任何东西,例如com.foo.ejb.excellentejb和com.foo.ejb.differencejb。我不想在子项目中定义任何特定的内容,只想在根项目中定义一个继承的任务(或一组生成的任务-我的前进方向)。如果有更优雅的方法,请告诉我:)