首页 > 解决方案 > 使用 Gradle 从单个源项目编译多个 jar

问题描述

我正在使用 Gradle 构建一个用于 Spark 应用程序的库。此类库通常以 Scala 版本和 Spark 版本的多种组合形式提供。例如,对于spark-testing-base - 您可以看到mvn cntrl上有多个工件可用,通常适用于每个 Scala/Spark 组合。

我正在寻找一种优雅的方式来进行此构建。

我在这个问题中看到了从同一来源构建多个 jar 的解决方案,这正是我想要的,但它将涉及为每个组合手动编写子项目。(在链接的问题中,只构建了两个工件,我想构建至少九个,也许更多)。

所以我的问题 - 有没有更好的方法来做到这一点,或者上面描述的解决方案是唯一的方法?

更新:我看到了两个可能有用的 Gradle 插件,但还没有时间检查它们——下面的链接供感兴趣的人使用:

https://github.com/ADTRAN/gradle-scala-multiversion-plugin

https://github.com/uklance/gradle-java-flavors

标签: scalaapache-sparkgradle

解决方案


您可能可以使用配置来完成此操作。

尝试在要构建的依赖项的版本组合上的嵌套循环中声明配置。
然后,将依赖项的各种组合分配给配置。
为所有配置创建归档任务。
最后,为所有配置声明工件。

例如:

scalaDependencies.each { scalaDep ->
    sparkDependencies.each { sparkDep ->

        def configurationName = buildConfigurationName(scalaDep, sparkDep)

        configurations.create(configurationName)
        configurations."$configurationName" {
            extendsFrom compile // this would be the simplest case
        }

        dependencies {
            "$configurationName"(scalaDep)
            "$configurationName"(sparkDep)
        }

        task("${configurationName}Jar", type: Jar) {
            from "$configurationName"
        }

        artifacts {
            "$configurationName"("${configurationName}Jar")
        }
    }
}

和只是您通常声明为依赖项的字符串,包括各自的版本号scalaDependencies。您必须自己弄清楚 的方法/关闭;) 我现在正在从臀部编码,但我很确定如果您填写剩余的位,这将起作用。 您可能还需要另一个块来实际创建s,但如果它可以创建 Jars,我认为您可以解决这个问题。sparkDepdendencies
buildConfigurationName

mavenPublication

我有一个有点相似的工作示例,从名称列表中声明多个源集和工件,这也可能有帮助。
在这里找到它:https ://github.com/thokari/gradle-workshop/blob/master/examples/09-multiple-artifacts/build.gradle


推荐阅读