我正在使用 Gradle 构建一个用于 Spark 应用程序的库。此类库通常以 Scala 版本和 Spark 版本的多种组合提供。例如,对于 spark-testing-base - 您可以在 mvn cntrl 上看到多个工件可用,通常用于每个 Scala/Spark 组合。
我正在寻找一种优雅的方式来进行此构建。
我在 this question 看到的从同一个源构建多个 jar 的解决方案,这正是我想要的,但它将涉及为每个组合手动编写子项目。 (在链接的问题中,只构建了两个工件,我想构建至少九个,也许更多)。
所以我的问题 - 有没有更好的方法来做到这一点,还是上面描述的解决方案是唯一的方法?
更新:我看到了两个可能有用的 Gradle 插件,但还没有时间检查它们 - 任何感兴趣的人都可以在下面找到链接:
https://github.com/ADTRAN/gradle-scala-multiversion-plugin
https://github.com/uklance/gradle-java-flavours
最佳答案
您可以使用配置来完成此操作。
尝试在要构建的依赖项的版本组合上的嵌套循环中声明配置。
然后,将依赖项的各种组合分配给配置。
为所有配置创建归档任务。
最后,为所有配置声明工件。
例如。:
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
和 sparkDepdendencies
将只是您通常声明为依赖项的字符串,包括相应的版本号。方法/闭包
buildConfigurationName
你必须弄清楚自己;)我现在正在编写代码,但我很确定如果你填写剩余的位,这会起作用。
您可能还需要另一个块来实际创建
mavenPublication
s,但如果它可以创建 jar ,我认为你可以解决这个问题。我有一个有点类似的工作示例,从名称列表中声明多个 sourceSets 和工件,这也可能有帮助。
在这里找到它:https://github.com/thokari/gradle-workshop/blob/master/examples/09-multiple-artifacts/build.gradle
关于scala - 使用 Gradle 从单个源项目编译多个 jar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52720283/