1

es4hadoop对于 Apache Spark ,我需要支持同一库的 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中使用新旧弹性搜索库。

我已经知道可以relocate使用插件进行库shadowJar,但是可以重新定位特定版本吗?

4

1 回答 1

0

将其中一个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')
}

您现在可以通过这种方式声明同一个类:

package com.github.chehsunliu.stackoverflow.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文件以确保解析的正确性。

参考

于 2021-08-03T05:33:33.963 回答