你应该遮蔽你的依赖吗?

时间:2017-09-22 15:05:06

标签: java apache-spark gradle dependencies

对于我的工作,我每天都使用Spark。其中一个问题来自依赖冲突。我不禁想到,如果人们将他们的罐子放到他们自己的名字空间中,他们都会消失。

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

1 个答案:

答案 0 :(得分:0)

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

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

然后,您希望在运行时对系统中的所有Logger执行某些操作,但突然间您在运行时会获得许多不同的记录器类和类版本。

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