当前位置: 首页 > 面试题库 >

您是否应该在客户端jar中提供依赖库?

魏成济
2023-03-14
问题内容

我们为其他内部应用程序提供了一个客户端jar,以连接到我们应用程序的REST
API。我们的API依赖于一些标准的Jakarta库。将这些JAR文件包含在我们的客户端jar文件中是最佳实践吗?还是只记录依赖关系,并由客户机来确保它们在类路径上有那些jar?


问题答案:

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

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

有一种选择,那就是使用诸如maven shade plugin之类的东西将您的依赖项重新定位到您自己的包名称空间中。当然,这样做的缺点是您将增加库的代码大小,但从好的方面来说,您几乎可以保证依赖版本,而不会影响客户端可能正在使用的任何其他库。

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

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

  • 文档,确保您记录依赖项以及与先前版本的任何已知冲突-没人真正读过它
  • 通过依赖管理的系统来分发您的库…像maven或ivy repo,它们使您能够在非常特定的范围内(包括上限)记录依赖项,即您的客户知道它们仍然可以被覆盖在做
  • 在MANIFEST.MF中添加OSGi信息-仅在您的客户端实际使用OSGi时有用
  • 如果您的依赖项是使用maven构建的,或者在清单文件中包含版本信息,则可以编写某种检查例程,以扫描这些类路径并检查其中的版本-有点极端

最后,要真正确保您具有所需的依赖关系非常困难,因为Java是一种后期绑定语言,因此有可能使您的依赖关系(即使是捆绑在一起)被包括在类路径上的其他版本的人覆盖了(即使是捆绑在一起的)。

注意:我最近度过了 非常
糟糕的一天,试图找出为什么我们的一个应用程序未能找到新版本的log4j。原因:有人试图提供帮助,将其捆绑到一个随机的,完全无关的广口瓶中。



 类似资料:
  • 我目前正在尝试将一个通过RFC连接到SAP系统的旧Java EE解决方案迁移到Quarkus。由于项目使用maven,我再次面临sapjco3的问题。来自SAP的jar库,防止该库被重命名。如果我像那样添加库作为依赖项 它将被添加到lib目录中,名称为com.sap.sapjco3-3.1.jar.不幸的是,最终以异常结束 JAVAlang.ExceptionInInitializerError:

  • 问题内容: 所以基本上我想用OAuth 2.0保护我的API,并实现一个OAuth Provider来启用对accessTokens的获取。 开箱即用可以完成JOAuth吗? 是否有人已经使用开源库(Java)实现了类似的东西? 问题答案: Spring Security的OAuth子项目支持OAuth 1.0a和OAuth2(客户端和服务器)。他们在GitHub存储库上有示例代码: 主要仓库:h

  • 在我们的项目中,我们有用于 REST 层、EJB 层和域(实体)层的单独模块。 以下是对 REST 层的依赖关系: 问题1:提供了所有这些?有可能简化吗?所有这些依赖项都应该显式声明吗?如果没有,RestEasy默认提供了什么?事实上,我使用的是JBoss AS 6,因此这些依赖项仅用于编译时。它们的范围是。 同样适用于我们的域层: 问题2:为什么在我们的pom中明确声明了这些。xml?hiber

  • 我需要存储用户提供给我的非常敏感的秘密(用户名+密码+证书以验证进入第三方API)。 我首先考虑的是AWS秘密管理器,它非常昂贵,而且IMHO主要用于基础设施机密(数据库密码、API密钥……),而不是客户提供的机密。现在,我正在决定使用AWS KMS(以及使用信封加密将加密的机密存储在数据库(AWS RDS)中)和Hashicorp Vault。 https://www.vaultproject.

  • 我使用的是Elasticsearch 5.2和Spring Boot 1.5.1。我通过一个Spring应用程序中的Java客户端连接到它。当我在端口或上连接到它时,得到。在我的Java客户机中,我将属性设置为。通过端口9200上的cURL向它发送请求时,它工作正常。我在一个集群中有4个节点,我不能连接到其中任何一个。我的配置文件具有分部中的所有默认值,但除外,后者的值为。 我在用Gradle。我

  • 对于一个项目,我有这样类型的结构: 这很好,但前提是jar已经由上一个构建生成,这意味着我必须启动两次才能使其工作。 我认为问题在于,与常规依赖项(例如)不同,在不请求构建子项目的情况下计算文件树依赖项,并且在第一次构建时,没有向类路径添加jar文件。 我尝试了,但是没有成功,因为它是在求值之后执行的。 我不能将lib切换到Java插件,因为它是特定于Android的代码,而且我需要为其他项目构建