java - 你应该遮蔽你的依赖关系吗?

标签 java apache-spark gradle dependencies

对于我的工作,我使用 Spark每天。问题之一来自依赖冲突。我不禁想到,如果人们释放已经隐藏到自己命名空间的 jar ,它们都会消失。

对于内部 jar,我正在考虑为我们所有的依赖项执行此操作。除了一点点工作,我认为这是一个好主意。我有什么缺点/风险吗?

最佳答案

一些问题随着着色而消失,但出现了新的问题。一个问题是,您剥夺了用户使用与着色中使用的版本不同(已修补)版本的依赖项的机会。
但是阴影的主要风险是阴影类最终会暴露给客户。

所以假设你有 2 个依赖项 a,b,每个着色 log4j。因此,当您包含 a 和 b 时,您会在编译/运行时类路径中获得类 a.shaded.log4j.Logger(v1.3) 和 b.shaded.log4j.Logger(1.4)。你可能有自己的 log4j.Logger(1.5)。

然后你想在运行时对系统中的所有 Logger 做一些事情,但突然你在运行时得到了许多不同的 logger 类和类版本。

因此,只有当您可以确保客户端不会通过您的库的 API 看到任何着色类的实例时,着色才没有风险。但这很难保证。也许使用 Java9 中的模块,这会少一些问题,但即使在类路径上只有一个已知版本的任何类,也比大量使用相同名称但不同版本的阴影类更容易调试/管理。

关于java - 你应该遮蔽你的依赖关系吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46367816/

相关文章:

java - 使用 java-json 连接 JSON 元素

apache-spark - 在 IntelliJ 中调试时无法访问 SparkUI

gradle 从 : not using parent script directory 开始应用

apache-spark - python脚本中的spark-submit和SparkSession之间的区别?

python - 更改 Spark Web UI 的根路径?

gradle - 如何在gradle脚本中的任务外使用变量

gradle - sonarqube-gradle-plugin:为两个级别的子项目派生了错误的基本目录

java - 在java应用程序中读取外部属性文件

java - Applet 和对象标签 JSP 交互

java - Arraylist求助,如何将单个对象添加到列表中?