2017-09-22 55 views
2

对于我的工作,我每天使用Spark。其中一个问题来自依赖冲突。我不禁想到,如果人们释放已经隐藏在自己名字空间中的罐子,他们将全部消失。你应该遮蔽你的依赖吗?

对于内部罐子,我正在考虑对我们所有的依赖进行此操作。除了一小部分工作之外,我认为这是一个好主意。我缺少什么缺点/风险吗?

+1

显然是一个膨胀的问题。如果你包含10个库,每个库都有自己的'Spark'版本,那么'Spark'的jar将会是使用依赖分辨率选择单个版本的10倍。如果您将所有版本发布到存储库(例如nexus),那么您可能会发现多余的jar开始在nexus上占据一定的磁盘空间 –

+0

这个问题是一个坑,最底层是一个实现 - 无论你适合什么最适合你。 – awd

回答

0

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

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

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

因此,只有在确保客户端永远不会通过库的API看到任何阴影类的实例时,阴影才没有风险。但这很难保证。也许使用Java9中的模块,这将会有点问题,但即使如此,只有类路径上任何类的一个已知版本比调用/管理更易于使用相同名称但版本不同的阴影类。