你应该在客户端jar中提供依赖库吗?

Mar*_*eon 15 java client-library

我们为其他内部应用程序提供了一个客户端jar,以连接到我们的应用程序的REST API.我们的API依赖于一些标准的Jakarta库.将这些JAR文件包含在我们的客户端jar文件中是最佳做法吗?或者您只记录依赖项,并由客户确保他们的类路径上有这些jar?

Gar*_*vis 13

你应该捆绑任何第三方jar文件到您自己的罐子作为一位超级罐子,但它是很好的,包括所有的副本都需要在你的发行版的罐子在一个lib目录,或什么都讲.

主要原因是您的客户可能正在使用某种形式的依赖管理系统(maven/ivy等),并且提供实际上不属于您的项目的包和类将使这些方案无效.

有一种替代方法是使用类似maven shade插件的东西将依赖项重定位到您自己的包命名空间中.这当然有一个缺点,你将增加你的库的代码大小,但从好的方面,你可以几乎保证你的依赖项的版本,而不影响你的客户可能使用的任何其他库.

编辑:回应马库斯莱昂评论:

捆绑/重新定位的可能解决方案:

  • 文档,确保您记录您的依赖项以及与以前版本的任何已知冲突 - 没有人实际读取它
  • 通过依赖管理系统分发您的库...像maven或ivy repo,这些允许您在非常具体的边界(包括上层)中记录您的依赖项 - 仍然可以覆盖您的客户将知道他们正在做
  • 在MANIFEST.MF中添加OSGi信息 - 仅在客户实际使用OSGi时才有用
  • 如果您的依赖项是使用maven构建的,或者在那些清单文件中有版本信息,您可以编写某种检查例程来扫描类路径以查找这些并检查那些版本 - 有点极端

最后,实际上确保你拥有你想要的依赖是非常困难的,因为java是一种后期绑定语言,你可以在你的类路径上覆盖你的依赖项(即使捆绑)被包括不同版本的人覆盖.

注意:我最近花了很多时间试图找出为什么我们的某个应用程序找不到新版本的log4j.原因:有人试图将其捆绑成一个随机完全无关的罐子.


Bil*_*ard 5

你应该包括你依赖的任何罐子.如果您允许客户端提供标准jar,您可以依赖它们来提供正确的版本.如果你包含你知道你的应用程序使用的版本,那么对你们来说都是非常轻松的.

  • 您可以在应用程序jar的清单文件中指定应用程序的类路径.(http://java.sun.com/docs/books/tutorial/deployment/jar/downman.html)CLASSPATH定义(由环境变量定义)由jar的清单定义的"class-path"覆盖. (2认同)
  • 我从未尝试过将第三方 jar 捆绑到我的可执行 jar 文件中。您可以将它们放在 /lib 目录中,以便类加载器(使用您的 jar 清单)知道在哪里可以找到它们。 (2认同)