Java、类路径、类加载 => 同一 jar/项目的多个版本

2024-04-26

我知道对于经验丰富的程序员来说这可能是一个愚蠢的问题。但我有一个库(一个 http 客户端),我的项目中使用的一些其他框架/jar 需要它。但它们都需要不同的主要版本,例如:

httpclient-v1.jar => Required by cralwer.jar
httpclient-v2.jar => Required by restapi.jar
httpclient-v3.jar => required by foobar.jar

类加载器是否足够智能以某种方式将它们分开?很可能不是?如果所有三个 jar 中的类都相同,类加载器如何处理这个问题。加载哪一个以及为什么?

类加载器是否只拾取一个 jar,还是任意混合类?因此,例如,如果从 Version-1.jar 加载一个类,那么从同一个类加载器加载的所有其他类都会进入同一个 jar 吗?

你如何处理这个问题?

是否有一些技巧可以以某种方式将罐子“合并”到“required.jar”中,以便被视为“一个单元/包”Classloader,或以某种方式联系在一起?


与类加载器相关的问题是一个相当复杂的问题。 无论如何,您应该记住一些事实:

  • 应用程序中的类加载器通常不止一个。引导类加载器委托给适当的。当您实例化一个新类时,会调用更具体的类加载器。如果它找不到对您尝试加载的类的引用,它将委托给其父级,依此类推,直到您到达引导类加载器。如果它们都找不到对您尝试加载的类的引用,您将收到 ClassNotFoundException。

  • 如果您有两个具有相同二进制名称的类,可由同一个类加载器搜索,并且您想知道正在加载其中哪一个,则只能检查特定类加载器尝试解析类名的方式。

  • 根据java语言规范,类二进制名称没有唯一性约束,但据我所知,它对于每个类加载器应该是唯一的。

我可以找到一种方法来加载具有相同二进制名称的两个类,并且涉及到通过两个不同的类加载器覆盖默认行为来加载它们(及其所有依赖项)。 一个粗略的例子:

    ClassLoader loaderA = new MyClassLoader(libPathOne);
    ClassLoader loaderB = new MyClassLoader(libPathTwo);
    Object1 obj1 = loaderA.loadClass("first.class.binary.name", true)
    Object2 obj2 = loaderB.loadClass("second.class.binary.name", true);

我总是发现类加载器定制是一项棘手的任务。我宁愿建议避免多次 如果可能的话,不兼容的依赖关系。

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

Java、类路径、类加载 => 同一 jar/项目的多个版本 的相关文章

  • 将 CSV 文件读入 Java 作为数据库表

    我发现了很多关于使用 Java 读取 CSV 的帖子 并且他们所指向的 API 在读取 CSV 文件时都采用了面向行的方法 就像 当你得到一行时 获取每一列的值 我希望有一个更高级别的 API 比如在 Perl 中 DBI 允许您在 CSV
  • Antlr 处理异常

    我使用 Antlr 3 和 AST 树开发了一个复杂的语法 ANTLR 生成词法分析器和解析器 问题是 例如 当用户输入无效的语法时 该语法需要 用户没有输入此内容 然后在我的 Eclipse IDE 中出现以下异常 line 1 24 m
  • 如何用Java创建图像

    比如说在我的程序中 我有这个paint 方法 我的愿望是创建所绘制的矩形的图像 使用 for 循环 我尝试了下面的方法 它确实给了我那些矩形 蓝色 但背景是全黑的 当我运行程序而不创建图像 仅在 JFrame 上绘制矩形时 背景为白色 我怎
  • Jackson Json 将对象反序列化为列表

    我正在使用 Spring 的 Web 服务RestTemplate并反序列化Jackson 在来自服务器的 JSON 响应中 其中一个字段可以是对象或列表 这意味着它可以是 result or result 有没有办法通过对我要反序列化的类
  • 无法解析配置“:app:debugRuntimeClasspath”的所有文件。问题

    我的 android studio 遇到了下一个问题 导致 org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveEx
  • 黄瓜与 Micronaut

    我正在尝试将 Cucumber 与 Micronaut 一起使用 但当我尝试将其与 Cucumber 一起使用时 MicronautTest 注释根本不起作用 未注入 theApple 请参阅下面的代码 如果我在没有黄瓜的情况下运行它就可以
  • GSON:自定义对象反序列化

    好吧 我编辑了这个问题 因为它不够清楚 Edit 2 更新了 JSON 文件 我在 Android 应用程序中使用 GSON 我需要解析来自服务器的 JSON 文件 而且有点太复杂了 我不想让我的对象结构太重 所以我想简化内容 所以我的对象
  • 从继承的受保护 Java 字段创建公共访问器

    我怎样才能完成以下工作 class Foo extends javax swing undo UndoManager increase visibility works for method override def editToBeUnd
  • 无法启动组件 [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/LabWebServletHibernate]]

    当使用 eclipse neon 1 在 tomcat 8 上运行应用程序时 我收到此错误 它使用 spring 4 3 3 hibernate 5 2 4 和 maven 嚴重 A child container failed durin
  • 首选项活动中的广告“没有足够的空间来显示广告!需要:<480, 75>,拥有:<432, 1073741823>”

    我试图在偏好活动中展示广告 但它从未出现 Logcat 始终显示消息 没有足够的空间来显示广告 想要 有 这就是我制作广告的方式 我对广告有自定义偏好 public class AdmobPreference extends Prefere
  • (Java) 在 Mac OS X 上以编程方式访问“系统根目录”下的 SSL 证书

    我正在编写一个 Java 应用程序 它可以通过远程 Https 站点进行 REST Api 调用 远程站点由受信任的证书签名 它在 Windows 上运行良好 但由于 SSL 证书问题 在 OS X 上运行时遇到问题 我做了一些挖掘 发现原
  • Java 泛型和数字类型

    我想创建一个通用方法来有效地执行此操作 class MyClass static
  • 如何连接hibernate和DB2

    我正在运行一个使用 struts 和 hibernate 的应用程序 我目前正在使用 Derby 数据库 现在我必须转向 DB2 数据库 请告诉我 我必须做什么配置 休眠配置文件 我必须设置任何类路径吗 多变的 我知道 DB2 有两个 ja
  • 在 JSON 对象中强制执行非空字段

    我们的 REST API 接收一些 JSON 对象输入 其中某些字段要求不为空 这些可以是字符串 整数 甚至可以是其他一些类实例作为参考 我们正在尝试找到一种方法来强制这些字段不为空 而不是在 API 中进行空检查的正确方法 当前的 if
  • JSP 作为电子邮件模板

    有没有办法发送 MIME 电子邮件 其中电子邮件正文源自 JSP 我需要使用 Javamail 发送一封电子邮件 其中包含一个表格 我认为如果我可以使用 JSP 来完成所有格式设置和布局 将会很方便 在这个线程中 Java 电子邮件模板的建
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • Spring Boot如何加入自定义查询

    我需要创建一个端点 该端点按州返回人口普查数据以及城市列表 我目前使用两个端点来获取此数据 目前回应 自定义查询一 censusByState id 1 code 11 name Rond nia statePopulation 18152
  • 为什么 HttpServletRequest 输入流为空?

    我有这段代码 我从请求输入流读取输入并使用 JacksonMapper 转换为 POJO 它在具有 guice 支持的 jetty 7 容器中运行 Override protected void doPost HttpServletRequ
  • Android应用程序中的模式输入

    我想知道是否有其他替代方案可以替代 Android 上平庸的 EditText 密码输入 是否有 API 或开源代码可以集成到我的应用程序中 类似于锁屏图案解锁 Intent 可能会返回哈希值 数字 字符串或代表用户输入的模式的任何内容 我
  • 按字母顺序对对象的 ArrayList 进行排序

    我必须创建一个方法来排序数组列表根据电子邮件按字母顺序排列对象 然后打印排序后的数组 我在排序时遇到麻烦的部分 我已经研究过并尝试使用Collections sort vehiclearray 但这对我不起作用 我是因为我需要一个叫做比较器

随机推荐

  • 更改一个 y 轴的范围 nvd3/d3

    我目前正在使用 multiChart 模型 并且有两个不同的 y 轴 我想更改两个轴 使它们从 0 开始 因为目前它们从最小的 y 数据点开始 我尝试过执行以下操作 chart yAxis1 tickFormat d3 format f d
  • 如何在 imageView 点击时全屏显示 imageView?

    我从 url 获取图像并将其显示在 imageView 上 该功能运行正常 但我希望当我单击该图像时 它必须是全屏的 那么如何实现这个功能呢 我知道我错过了一些东西 请帮我 附有屏幕截图 我也希望我的应用程序具有相同的功能 这是我的代码 我
  • Android CameraX 不显示任何内容

    我已经实现了一个新示例 这里是a link https codelabs developers google com codelabs camerax getting started 0它描述了来自 Google Codelabs 的新 C
  • Verilog 按位或 ("|") 单子

    我见过 Verilog 代码 其中使用了按位或运算符 目的是什么 例如 address 15 14 0 or address 15 14 io din ramrd 不能省略 吗在这些情况下 在这种情况下 它充当归约运算符 例如 4 b100
  • maven的依赖冲突

    如果我有一些库在不同版本中具有其他依赖项 例如以下示例 commons logging 1 0 4 jar 因与 1 1 1 冲突而省略 和 commons logging 1 1 1 jar 对此的最佳实践是什么 通知在相关依赖项中排除此
  • 按名称获取形状 ID

    有什么办法可以得到一个形状Id如果你知道它是Name 例如 如果我有这个 Dim myshape As Shape myshape Name 我可以得到它吗Id myshape Id getIdByName myshape Name 当然
  • Android Studio v 1.1 / 1.2 中的渲染问题

    当我添加android support v7 widget Toolbar或其他android support v7 widget 存在渲染问题 But 支持库已是最新 我正确地编译了依赖项 我可以将它们导入MainActivity jav
  • 我可以为第二个侧边栏使用多个

    我可以使用多个吗
  • 安装Python时出错

    击中后 make install 我收到以下错误 usr bin install cannot create regular file usr local bin python2 6 Permission denied make altbi
  • 如何更改每个 Gradle 构建类型的应用程序名称

    我正在尝试找出一种方法来更改 gradle 中每个构建类型的应用程序的应用程序名称 例如 我希望调试版本具有
  • Winforms RichTextBox 中的两列

    在 C 中 我需要能够在单个 RichTextBox 中至少给出 2 列的印象 出于我的目的 它可能看起来像这样 1 1 2 70 8 5 565 1000000 300000 700000 76 10 66 对于左栏中的每个 问题 都会有
  • Aurelia 中的多个触发器

    我想在 aurelia 中触发两种不同的方法 实现此目的的最佳方法是什么 a 我可能会做以下事情 HTML a JavaScript yourFunction event parts this toggleSize size parts t
  • 在触发器上传递 JSON 数据

    我正在调用返回 JSON 数据的服务 Script ajax type POST url some service dataType json success function response if response status ok
  • MongoDB 推文数据库的日期范围查询失败

    我正在尝试对 mongo 数据库中的推文集合执行范围查询 由于某种原因 以下查询将起作用 db posts find created at gte Fri Nov 25 00 00 00 0000 2011 lt Fri Nov 25 23
  • 从节点子进程检索值

    var fp ffprobe fileName show streams grep var width exec fp width function err stdout stderr return stdout alert stdout
  • NgbDropdown autoClose“外部”不起作用

    我正在使用 Angular4 和 ng bootstrap 我想在下拉菜单外部单击时关闭下拉菜单 文档的其余部分 查看文档后我发现autoClose 类型 boolean 外面 里面 但是当我尝试将其设置为参数 config autoClo
  • 是否可以在浏览器中使用 javascript 对用户系统进行基准测试

    随着 Html5 开始普及 我们看到更多关于视频或画布元素等的实验 当使用画布进行实验时 例如用粒子制作烟花 1000 个粒子可能在现代机器上运行良好 但在 3 年机器上可能会运行得很慢 无论如何 是否可以对用户系统进行基准测试以动态更改画
  • 当摘要具有嵌入文本输入并且用户按空格键时,如何防止 html 详细信息元素切换

    我在处于打开状态的详细信息元素的摘要标签内有一个文本输入 目的是捕获用户输入 该输入最终将显示为详细信息元素 见下文 但是 当用户在输入文本时按空格键时 详细信息元素会切换 我想阻止这种情况 我预计这可以在按键事件中使用 stopPropa
  • xgboost中的eval_metric和feval有什么区别?

    有什么区别feval and eval metric在xgb train中 这两个参数仅用于评估目的 Kaggle 的帖子提供了一些见解 https www kaggle com c prudential life insurance as
  • Java、类路径、类加载 => 同一 jar/项目的多个版本

    我知道对于经验丰富的程序员来说这可能是一个愚蠢的问题 但我有一个库 一个 http 客户端 我的项目中使用的一些其他框架 jar 需要它 但它们都需要不同的主要版本 例如 httpclient v1 jar gt Required by c