对于我的工作,我使用 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/