【发布时间】:2019-04-05 13:20:04
【问题描述】:
我目前正在处理 Spark 2.1.0 中的一个项目,我需要导入一个 Spark 本身已经依赖的库。特别是,我希望 org.roaringbitmap:RoaringBitmap:0.7.42 替换 org.roaringbitmap:RoaringBitmap:0.5.11(org.apache.spark:spark-core_2.11:2.1.0.cloudera1 和 org.apache.spark:spark-sql_2.11:2.1.0.cloudera1 都依赖的库)。
我在build.gradle 中的依赖项如下
dependencies {
compile 'org.apache.spark:spark-core_2.11:2.1.0.cloudera1'
runtime ('org.apache.spark:spark-core_2.11:2.1.0.cloudera1') {
exclude group: 'org.roaringbitmap'
}
compile 'org.apache.spark:spark-sql_2.11:2.1.0.cloudera1'
runtime ('org.apache.spark:spark-sql_2.11:2.1.0.cloudera1') {
exclude group: 'org.roaringbitmap'
}
compile 'org.roaringbitmap:RoaringBitmap:0.7.42'
implementation 'org.roaringbitmap:RoaringBitmap'
constraints {
implementation('org.roaringbitmap:RoaringBitmap:0.7.42') {
because 'because of transitive dependency'
}
}
}
gradle -q dependencyInsight --dependency org.roaringbitmap 的输出显示依赖已更新
org.roaringbitmap:RoaringBitmap -> 0.7.42
variant "default+runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
\--- compileClasspath
org.roaringbitmap:RoaringBitmap:0.5.11 -> 0.7.42
variant "default+runtime" [
org.gradle.status = release (not requested)
Requested attributes not found in the selected variant:
org.gradle.usage = java-api
]
\--- org.apache.spark:spark-core_2.11:2.1.0.cloudera1
+--- compileClasspath
+--- org.apache.spark:spark-sql_2.11:2.1.0.cloudera1
| \--- compileClasspath
\--- org.apache.spark:spark-catalyst_2.11:2.1.0.cloudera1
\--- org.apache.spark:spark-sql_2.11:2.1.0.cloudera1 (*)
不幸的是,当我使用spark2-submit 运行我的应用程序时,运行时依赖项的实际版本是org.roaringbitmap:RoaringBitmap:0.5.11。
如何强制我的应用程序使用所需版本的 RoaringBitmap?
【问题讨论】:
-
我无法回答具体问题,但您确定“强制”版本是要走的路吗?它只有在 5.11 和 7.42 是二进制兼容的情况下才有效,也就是说,每个可访问代码的类和方法名称、参数和声明的异常都严格相同。如果 Spark 在 5.11 中调用 RoaringBitmap 的
A#whatever()并且此方法在 7.42 中已更改(或被删除),它将崩溃。您最好的选择是使用 Spark 的版本重新设计您的应用程序,或者使用shading。
标签: apache-spark gradle dependency-management