Gradle 5 的多个依赖版本
Multiple dependency versions with Gradle 5
我需要支持同一库的 2 个不同版本(以支持旧版本),es4hadoop
用于 Apache Spark。
- 版本
6.2.2
(https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch-spark-13_2.10/6.2.2)
- 版本
6.3.2
(https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch-spark-13_2.10/6.3.2)
两个版本具有相同的依赖项(scala-lang 和 Spark)。
完全不确定它的命名,但我想要这样的东西:
implementation(group: 'org.elasticsearch', name: 'elasticsearch-spark-13_' + scalaVersion, version:'6.2.2') {
exclude group: "org.scala-lang"
}
implementation(group: 'org.elasticsearch', name: 'elasticsearch-spark-13_' + scalaVersion, version:'6.3.2') {
exclude group: "org.scala-lang"
relocate org.elasticsearch org.elasticsearch6 // ???
}
所以我可以在同一个项目/JVM 中同时使用新旧 elasticsearch 库。
我已经知道 relocate
lib 可以使用 shadowJar
插件,但是是否可以重新定位特定版本?
将 elasticsearch-spark
依赖项之一放入子项目 aa2
并重新定位它。那么另一个子项目aa1
可以依赖aa2
的影子配置。
// aa2/build.gradle
dependencies {
implementation 'org.elasticsearch:elasticsearch-spark-13_2.10:6.2.2'
}
shadowJar {
relocate "org.elasticsearch", "org.elasticsearch_v6_2_2"
}
// aa1/build.gradle
dependencies {
implementation 'org.elasticsearch:elasticsearch-spark-13_2.10:6.3.2'
implementation project(path: ':aa2', configuration: 'shadow')
}
您现在可以这样声明相同的 class:
package com.github.chehsunliu.Whosebug.q56332118;
import org.elasticsearch.spark.cfg.SparkSettings;
public class App {
public static void main(String[] args) {
System.out.println(SparkSettings.class);
System.out.println(org.elasticsearch_v6_2_2.spark.cfg.SparkSettings.class);
}
}
但是,你应该多注意它们的传递依赖。您可能还需要重新定位它们以使直接依赖关系正常工作。有时我会解压缩输出的 JAR 文件并调查这些 .class
文件以确保解析的正确性。
参考资料
我需要支持同一库的 2 个不同版本(以支持旧版本),es4hadoop
用于 Apache Spark。
- 版本
6.2.2
(https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch-spark-13_2.10/6.2.2) - 版本
6.3.2
(https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch-spark-13_2.10/6.3.2)
两个版本具有相同的依赖项(scala-lang 和 Spark)。
完全不确定它的命名,但我想要这样的东西:
implementation(group: 'org.elasticsearch', name: 'elasticsearch-spark-13_' + scalaVersion, version:'6.2.2') {
exclude group: "org.scala-lang"
}
implementation(group: 'org.elasticsearch', name: 'elasticsearch-spark-13_' + scalaVersion, version:'6.3.2') {
exclude group: "org.scala-lang"
relocate org.elasticsearch org.elasticsearch6 // ???
}
所以我可以在同一个项目/JVM 中同时使用新旧 elasticsearch 库。
我已经知道 relocate
lib 可以使用 shadowJar
插件,但是是否可以重新定位特定版本?
将 elasticsearch-spark
依赖项之一放入子项目 aa2
并重新定位它。那么另一个子项目aa1
可以依赖aa2
的影子配置。
// aa2/build.gradle
dependencies {
implementation 'org.elasticsearch:elasticsearch-spark-13_2.10:6.2.2'
}
shadowJar {
relocate "org.elasticsearch", "org.elasticsearch_v6_2_2"
}
// aa1/build.gradle
dependencies {
implementation 'org.elasticsearch:elasticsearch-spark-13_2.10:6.3.2'
implementation project(path: ':aa2', configuration: 'shadow')
}
您现在可以这样声明相同的 class:
package com.github.chehsunliu.Whosebug.q56332118;
import org.elasticsearch.spark.cfg.SparkSettings;
public class App {
public static void main(String[] args) {
System.out.println(SparkSettings.class);
System.out.println(org.elasticsearch_v6_2_2.spark.cfg.SparkSettings.class);
}
}
但是,你应该多注意它们的传递依赖。您可能还需要重新定位它们以使直接依赖关系正常工作。有时我会解压缩输出的 JAR 文件并调查这些 .class
文件以确保解析的正确性。