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

Java,Classpath,Classloading =>同一jar /项目的多个版本

柴砚文
2023-03-14
问题内容

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

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

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

Classloader是仅拾取一个jar还是将其任意混合?因此,例如,如果从Version-1.jar中加载了一个类,那么从同一类加载器中加载的所有其他类都将都放入同一个jar中吗?

你如何处理这个问题?

是否有某种技巧可以以某种方式将jar“合并”到“ required.jar”中,从而使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);

我总是发现类加载器定制是一项棘手的任务。如果可能,我宁愿避免使用多个不兼容的依赖项。



 类似资料:
  • 问题内容: 我有一个Java项目正在使用两个导入的具有相同类()的jar 。导入类时,有没有一种方法可以明确说明要使用哪个jar?使用: 似乎按照构建路径顺序的顺序使用该类,但是由于某种原因,似乎并非如此 在运行时。我正在Eclipse中构建项目。 问题答案: 您不能仅在Java源代码中执行所要求的操作。Java不是为此而设计的。 这是一种糟糕的情况,只有使用自定义类加载器才能可靠地处理它们,每个

  • 1.背景 项目里已经引入了bcprov-jdk15on-1.54.jar,并且在很多地方使用. 现在合作方给过来一套新的接入资料,里面有以下jar包. 2.问题 项目中的bcprov-jdk15on存在两个版本,旧的是1.54,新的是1.69. 类似于下面这张图: 由于很多地方用到了1.54版本,所以不能直接升级到1.69. 现在想实现以下两点: 对于本次的新版本,其中的fintech-java-

  • 我想在eclipse下处理同一个多模块maven项目的两个不同版本。 不幸的是,当您在eclipse下导入多模块maven项目时,您可以自己更改父模块项目名称以防止冲突,但不能更改子模块项目名称。子模块作为根项目导入,以模块名称命名。显然在导入过程中无法重命名它们。 在理想情况下,我希望保持pom不变。显然,我希望保持相同的eclipse工作区。。。

  • (该章需加入更多内容。。。原稿写的太简单了)我们同时也加入了一个发行版本, 将会送到客户端: Example 7.14. 多项目构建 - 发行文件 api/build.gradle task dist(type: Zip) { dependsOn spiJar from 'src/dist' into('libs') { from spiJar.archiv

  • 清单在一行上只包含版本,然后在一行上包含主类属性,然后是2个空行 所有依赖项都位于相对于jar的/lib文件夹中,因此清单中没有指定类路径 在zip文件程序中打开jar显示文件夹,其中包含文件,因此限定名反映在jar结构中。资本化也是正确的。 罐子结构: 清单文件:

  • Maven插件(maven-compiler-plugin: 3.8.1和maven-surefire-plugin: 3.0.0-M3)在运行mvn清洁包时似乎正在下载同一依赖项(plexus-utils)的多个版本,即使我在依赖项中指定了plexus-utils的最新版本。这不会导致任何错误,但3.0.16之前的任何版本的plexus-utils都容易受到命令注入的影响。有没有办法阻止这种情况