如何在Gradle构建项目中创建几个ejb jar?
我有一个多项目构建和每个项目我都在主SRC树几个包这就需要从SRC作为单独的EJB工件的其余部分分开打包:如何在Gradle构建项目中创建几个ejb jar?
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和生成而不必在子项目中显式定义EJB(但可能是一个属性集“containsEjbs”以缩小具有EJB的子项目)。
我在思考如何使用文件树来抓取src包(com.foo.ejb。*),然后迭代和Jaring - 但它如何在上下文中执行此Jaring这是我遇到麻烦的任务。
谢谢你的帮助,克里斯。
我最终做了以下工作。在[根] /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 =真”,则任务被添加为属于“/ COM /富/ EJB”中找到的每个EJB包各自的(子)项目。我们将META-INF与描述符一起存储在与类相同的源代码树中,因此可能会对您的设置进行调整。
您可以简单地定义类型的新任务:罐
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
thx,但是这并没有描述如何为每个项目中的每个任意命名的ejb包创建单独的Jars。也许我不够清楚 - 我想要这个,而不必在每个项目中手动指定Jar任务,即。一个自动查找ejb包/目录然后为其中的每个添加任务的例程。因此,我可以与所有项目共享此逻辑,而无需为每个项目编写特定的任务。我现在变得非常接近,但不知道它的正确方法... – Chris 2010-09-08 15:01:10
如果结构在每个子项目中都是一致的,您可以在父模块中配置一次,并且它将被所有人继承。您还可以根据需要使用简单的闭包语法修改/增强每个子项目中的特定配置,即ejb1 {//配置在子模块中进入} – TheKaptain 2010-09-08 20:25:04
是的,这就是问题的一部分,结构*不是*一致的就底层包装而言。最上面的部分是:com.foo.ejb - 但是这之后的包可以是任何东西,例如com.foo.ejb.excellentejb和com.foo.ejb.differentejb。我不想在子项目中定义任何特定的东西,只是在根项目中定义的一个继承的任务(或一组生成的任务 - 我正在介绍的方向)。 – Chris 2010-09-10 08:18:12
如果有更好的做法,请告诉我:) – Chris 2010-09-30 13:50:11