我们为其他内部应用程序提供了一个客户端jar,以连接到我们应用程序的REST API。我们的API依赖于一些标准的Jakarta库。将这些JAR文件包含在我们的客户端jar文件中是最佳实践吗?还是只记录依赖关系,并由客户机来确保它们在类路径上有那些jar?
你应该 不 捆绑任何第三方jar文件到您自己的罐子作为一位超级罐子,但它是很好的,包括所有所需在分发比方说在lib目录或什么都罐子的副本。
这样做的主要原因是您的客户可能正在使用某种形式的依赖管理系统(maven / ivy等),并且提供实际上不属于您的项目的包和类会使这些方案无效。
有一种选择,那就是使用诸如maven shade plugin之类的东西将您的依赖项重新定位到您自己的包名称空间中。当然,这样做的缺点是您将增加库的代码大小,但从好的方面来说,您几乎可以保证依赖版本,而不会影响客户端可能正在使用的任何其他库。
编辑: 回应马库斯·莱昂评论:
没有捆绑/重新定位的可能解决方案:
最后,要真正确保您具有所需的依赖关系非常困难,因为Java是一种后期绑定语言,因此有可能使您的依赖关系(即使是捆绑在一起)被包括在类路径上的其他版本的人覆盖了(即使是捆绑在一起的)。
注意:我最近度过了 非常 糟糕的一天,试图找出为什么我们的一个应用程序未能找到新版本的log4j。原因:有人试图提供帮助,将其捆绑到一个随机的,完全无关的广口瓶中。