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

2024-03-24

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


你应该not将任何第三方 jar 作为 uber jar 捆绑到您自己的 jar 中,但最好将您的发行版中所需的所有 jar 的副本(例如 lib 目录或其他目录)包含在内。

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

有一种选择,那就是使用类似Maven 阴影插件 http://maven.apache.org/plugins/maven-shade-plugin/将您的依赖项重新定位到您自己的包命名空间中。当然,这有一个缺点,即您将增加库的代码大小,但从好的方面来说,您几乎可以保证依赖项的版本,而不会影响您的客户可能使用的任何其他库。

EDIT:回应马库斯·莱昂的评论:

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

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

最后,要真正确保您拥有所需的依赖项是非常困难的,因为 java 是一种后期绑定语言,您的依赖项(即使是捆绑的)可能会被包含在类路径上的版本之前的不同版本的人覆盖。

注:我最近花了very试图找出为什么我们的一个应用程序无法找到新版本的 log4j 的糟糕一天。原因:有人试图提供帮助,将其捆绑到一个随机的完全不相关的罐子中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

是否应该在客户端 jar 中提供依赖库? 的相关文章

  • 如何在日期选择器中设置不在当前月份的单元格的样式

    我目前正在为我的 JavaFX 应用程序制作注册表 问题是 当日期选择器中的单元格不在页面的月份上时 我想让该单元格变灰 让我们看看我当前的日期选择器 我的日期选择器 正如您所看到的 我希望下个月的日期 27 日 28 日 30 日以及 1
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • IntelliJ IDEA 创建的 JAR 文件无法运行

    我在 IntelliJ 中编写了一个跨越几个类的程序 当我在 IDE 中测试它时它运行良好 但是 每当我按照教程将项目制作成 jar 可执行文件时 它就不会运行 双击 out 文件夹中的文件时 该文件不会运行 并显示 无法启动 Java J
  • 在浏览器中点击应用程序时播放框架挂起

    我正在 Play 中运行一个应用程序activator run 也许 5 次中有 3 次 它会挂起 当我去http localhost 9000 它就永远坐在那里旋转 我看到很多promise timed out错误也 我应该去哪里寻找这个
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • Clip 在 Java 中播放 WAV 文件时出现严重延迟

    我编写了一段代码来读取 WAV 文件 大小约为 80 mb 并播放该文件 问题是声音播放效果很差 极度滞后 你能告诉我有什么问题吗 这是我的代码 我称之为doPlayJframe 构造函数内的函数 private void doPlay f
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 将多模块 Maven 项目导入 Eclipse 时出现问题 (STS 2.5.2)

    我刚刚花了最后一个小时查看 Stackoverflow com 上的线程 尝试将 Maven 项目导入到 Spring ToolSuite 2 5 2 中 Maven 项目有多个模块 当我使用 STS 中的 Import 向导导入项目时 所
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 查看Jasper报告执行的SQL

    运行 Jasper 报表 其中 SQL 嵌入到报表文件 jrxml 中 时 是否可以看到执行的 SQL 理想情况下 我还想查看替换每个 P 占位符的值 Cheers Don JasperReports 使用 Jakarta Commons
  • 休眠以持久保存日期

    有没有办法告诉 Hibernate java util Date 应该持久保存 我需要这个来解决 MySQL 中缺少的毫秒分辨率问题 您能想到这种方法有什么缺点吗 您可以自己创建字段long 或者使用自定义的UserType 实施后User
  • 如何修复“sessionFactory”或“hibernateTemplate”是必需的问题

    我正在使用 Spring Boot JPA WEB 和 MYSQL 创建我的 Web 应用程序 它总是说 sessionFactory or hibernateTemplate是必需的 我该如何修复它 我已经尝试过的东西 删除了本地 Mav
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • 测量时间间隔和乱序执行

    我一直在阅读有关 Java 内存模型的内容 并且我知道编译器可以重新组织语句来优化代码 假设我有以下代码 long tick System nanoTime function or block whose time i intend to
  • 将 Option[x]“转换”为 x

    我正在使用 Scala 2 1 的 play 我需要转换Option Long 价值Long 我知道如何做相反的事情 我的意思是 def toOption Long value Long Option Long if value null
  • 在OpenSSL中使用RSA公钥生成相应的私钥?

    我知道可以使用这个链接 https www ibm com support knowledgecenter en SSWHYP 4 0 0 com ibm apimgmt cmc doc task apionprem gernerate s
  • React-Native:Formik ref 无法获取值

    我在react native中有一个带有formik形式的虚拟登录代码 import React Component from react import TextInput Text Alert Image View TouchableOp
  • 蛋糕模式可以用于非单例样式依赖吗?

    我遇到的大多数蛋糕模式示例似乎都将依赖关系视为单例类型服务 其中 在组件的最终组装中每种类型只有一个实例 当使用蛋糕模式进行依赖注入时 是否可以编写一个具有多个特定类型实例的配置 可能以不同的方式配置 考虑以下组件 通用 HTTP 服务 t
  • 将正则表达式从 .NET 转换为 javascript 时出错

    我有这段 VBNet 代码 我想将其转换为 JavaScript Dim phone check pattern 0 9 1 3 0 9 0 9 x X e E x X t T 0 9 0 9 System Diagnostics Debu
  • 在 bash 脚本中发送邮件输出文字 \n 而不是换行

    我正在使用以下 bash 脚本发送电子邮件 bin bash recipients email protected cdn cgi l email protection email protected cdn cgi l email pro
  • 如何在 IntelliJ IDEA 中运行 Scala 脚本?

    这是一个简单的 Scala 脚本 object test def hi print hi there from here test hi 从命令行它会执行预期的操作 scala shared scaladem src main scala
  • 如何将值应用于函数列表

    我想要实现的是 apply a gt a gt b gt b 这是一种映射的逆 map a gt b gt a gt b 我试过胡格尔 但没有成功 任何人都可以建议一种在 Haskell 中执行此操作的干净方法吗 apply a gt a
  • 如何向 javascript 对象添加键值

    我正在努力学习JS 这看起来很简单 但我不知道该怎么做 拥有基于此的 javascript 对象很好thread https stackoverflow com questions 688097 objects vs arrays in j
  • 如何处理 nil 值变量

    我有如下模型 struc Info Decodable var firstName String var lastName String 在表格视图单元格中显示时 我正在做的事情如下 personName text personArray
  • 使用 APP Store 配置文件导出 iPhone 应用程序时出现“符号工具失败”错误

    成功存档后 在将存档导出到 保存以进行应用商店部署 时 出现以下错误 符号工具失败 在导出过程中 我观察到 二进制和权利 部分有两个条目 1 应用商店 targetAppName 5 个权利 具有有效的配置文件 2 构建文件之一FTALDe
  • 从扩展内获取 Chrome 选项卡的窗口句柄?

    我编写了一个 Chrome 扩展 也带有 NPAPI 允许我的应用程序和 Chrome 相互通信 这一切基本上都工作正常 我现在想做的是将 Chrome 窗口的 HWND 绑定到特定的窗口 ID 和选项卡 ID 当我在 Chrome 中 通
  • 我可以弹出到特定的 ViewController 吗?

    我正在使用基于导航的应用程序 我将第一个 ViewController 推到第二个 ViewController 然后从第二个 ViewController 推到第三个 ViewController 现在我想从第三个 ViewControl
  • 配置配置文件不支持无线配件配置功能

    从 Xcode 7 3 升级到 Xcode 8 后 出现错误 供应配置文件 iOS团队供应配置文件 没有 支持无线配件配置功能 我可以知道如何解决这个问题吗 您应该在苹果的开发者门户中启用它 转到 应用程序 ID 并编辑您的应用程序 检查W
  • Omniauth Facebook 不返回电子邮件和性别栏 4

    我需要从 Facebook 获取姓名 电子邮件 图像和性别 我正在获取姓名和图像 但电子邮件和性别不是从 Facebook 获取的 我这两天都在苦苦挣扎 谁能帮帮我 用户模型 def self from omniauth auth wher
  • 在 Kindle Fire 上调试 Adob​​e AIR 应用程序

    可能的 我认为要做到这一点 我需要将 Fire 上的 AIR 运行时升级到 3 但应用商店中的版本无法安装 据我所知 我无法创建既是强制运行时又是调试的 AIR apk 因此应用程序的调试版本必须在安装的 AIR 运行时上运行 由于 Fir
  • 如何创建从 C++17 中的可变参数模板推导的类型向量元组?

    我已经实现了一个集合类 它将元组向量转换为向量元组 它本质上是 AOS 到 SOA 的转换 此代码适用于两个模板类的示例 我试图通过使用可变参数模板使其更加通用 为了做到这一点 我需要为成员变量创建类型m col 在 C 17 中 是否可以
  • Java - 重置输入流

    我正在处理一些Java代码 其中有一个我读取了一次的InputStream 然后我需要以相同的方法再次读取它 问题是我需要将其位置重置为开头才能读取两次 我找到了一个解决该问题的黑客式解决方案 is mark Integer MAX VAL
  • 是否应该在客户端 jar 中提供依赖库?

    我们正在为其他内部应用程序提供一个客户端 jar 以连接到我们应用程序的 REST API 我们的 API 依赖于一些标准 Jakarta 库 将这些 JAR 文件包含在我们的客户端 jar 文件中是否是最佳实践 或者您只是记录依赖关系 并