Gradle如何构建包含某些子项目输出的Rpm?

时间:2014-10-31 14:30:14

标签: java gradle rpm

我有一个多项目设置,我想在某些子项目中构建Rpm文件,其中包含来自其他子项目的人工制品。好像我需要一些Gradle基础知识的帮助。

项目布局如下:

rootProject
|
|-commonLibs
|
|---serviceA
| |
| |--module1
| \--module2
|
\---serviceB
  |
  |--module3
  \--module4

这两项服务都依赖于commonLibs。

我正在使用nebula.os-package 2.0.2和Gradle 2.2快照发布。

由于服务A和B将在不同的机器上运行,当然我希望它们以不同的RPM运行。

我想要完成的是让每个Rpms包括:

  1. commonLibs的输出(jars)(或者甚至是所有依赖关系jar),
  2. 子模块的某些工件(jar和资源文件)
  3. 我更愿意避免列出要包含的每个文件,因为我稍后会添加更多子模块。我们当然可以利用Gradle的常规机制。

    所以,我以为我会在serviceA和serviceB的build.gradle做类似的事情:

    apply plugin: 'os-package'
    ospackage {
       ext.outputFiles = []
       project.childProjects.each {
         jar.outputs.files.each { File f ->
            outputs.add (f)
         }
       }
       from files(outputFiles) {
         into '/opt/mybusiness/product/lib'
       }
    }
    

    显然,这不起作用:

    gradlew serviceA:buildRpm
    [...]
    * What went wrong:
    A problem occurred evaluating project ':serviceA'.
    > Could not find property 'jar' on com.netflix.gradle.plugins.packaging.ProjectPackagingExtension_Decorated@2805c769.
    

    好的,serviceA不是Java项目,所以我没有将java插件应用于它,只有os-package插件。然而,子模块都应用了'java'插件,所以我假设我可以从each闭包中访问他们的jar任务。这必须是构建订单问题。正确?

    在我的位置上,我应该做什么呢?任何使用nebula.os-package进行多项目构建的策略示例都是受欢迎的。我一直在网上搜索,但我找不到任何问题。

1 个答案:

答案 0 :(得分:1)

我想,这样的事情应该可以解决 - 在build.gradle中添加:serviceA& :serviceB

configurations {
    commonJars
}

dependencies {
    commonJars project( path: ':commonLibs' ) // might be needed to add 'configuration' as well
}

ospackage {
    from configurations.commonJars
    ..
}