草庐IT

classloader

全部标签

java - jar hell : how to use a classloader to replace one jar library version with another at runtime

我对Java还是比较陌生,所以请多多包涵。我的问题是我的Java应用程序依赖于两个库。我们称它们为库1和库2。这两个库都对库3具有相互依赖关系。但是:库1需要库3的版本1。库2需要库3的版本2。这正是JARhell的定义(或至少一个它的变体)。如链接中所述,我无法在同一个类加载器中加载第三个库的两个版本。因此,我一直试图弄清楚是否可以在应用程序中创建一个新的类加载器来解决这个问题。我一直在研究URLClassLoader,但我一直无法弄清楚。这是一个演示该问题的示例应用程序结构。应用程序的Main类(Main.java)尝试实例化Library1和Library2并运行在这些库中定义的

java - Class.getResource 和 ClassLoader.getSystemResource : is there a reason to prefer one to another?

我看到Class.getResource和ClassLoader.getSystemResource都用于在Java中定位资源。有什么理由比另一个更喜欢一个吗? 最佳答案 加载资源有多种方式,每一种的含义略有不同——ClassLoader::getSystemResource()使用系统类加载器。这使用用于启动程序的类路径。如果你在一个web容器中,比如tomcat,这不会从你的WAR文件中获取资源。Class#getResource()将类的包名添加到资源名中,然后委托(delegate)给它的类加载器。如果您的资源存储在反射(r

java - Class.getResource 和 ClassLoader.getSystemResource : is there a reason to prefer one to another?

我看到Class.getResource和ClassLoader.getSystemResource都用于在Java中定位资源。有什么理由比另一个更喜欢一个吗? 最佳答案 加载资源有多种方式,每一种的含义略有不同——ClassLoader::getSystemResource()使用系统类加载器。这使用用于启动程序的类路径。如果你在一个web容器中,比如tomcat,这不会从你的WAR文件中获取资源。Class#getResource()将类的包名添加到资源名中,然后委托(delegate)给它的类加载器。如果您的资源存储在反射(r

java - sun.reflect.CallerSensitive 注释是什么意思?

@CallerSensitive注解上述方法的含义是什么?例如,注解存在于Class的getClassLoader方法中@CallerSensitivepublicClassLoadergetClassLoader(){//} 最佳答案 根据我在评论中链接的JEP(也是here),Acaller-sensitivemethodvariesitsbehavioraccordingtotheclassofitsimmediatecaller.Itdiscoversitscaller’sclassbyinvokingthesun.refl

java - sun.reflect.CallerSensitive 注释是什么意思?

@CallerSensitive注解上述方法的含义是什么?例如,注解存在于Class的getClassLoader方法中@CallerSensitivepublicClassLoadergetClassLoader(){//} 最佳答案 根据我在评论中链接的JEP(也是here),Acaller-sensitivemethodvariesitsbehavioraccordingtotheclassofitsimmediatecaller.Itdiscoversitscaller’sclassbyinvokingthesun.refl

java - 如何从不同的 JAR 中读取多个同名的资源文件?

如果类路径中有两个JAR文件,它们的根目录中都包含一个名为“config.properties”的资源。有没有办法检索both类似于getClass().getResourceAsStream()的文件?顺序不相关。如果可能的话,另一种方法是加载类路径中符合特定条件的每个属性文件。 最佳答案 您需要ClassLoader.getResources(name)(或静态版本ClassLoader.getSystemResources(name))。但不幸的是,存在一个已知问题,即不在“目录”内的资源。例如。foo/bar.txt很好,但

java - 如何从不同的 JAR 中读取多个同名的资源文件?

如果类路径中有两个JAR文件,它们的根目录中都包含一个名为“config.properties”的资源。有没有办法检索both类似于getClass().getResourceAsStream()的文件?顺序不相关。如果可能的话,另一种方法是加载类路径中符合特定条件的每个属性文件。 最佳答案 您需要ClassLoader.getResources(name)(或静态版本ClassLoader.getSystemResources(name))。但不幸的是,存在一个已知问题,即不在“目录”内的资源。例如。foo/bar.txt很好,但

java - 当同一个类存在于同一服务器上的不同应用程序中时,类加载如何工作?

我在应用服务器上运行了多个网络应用,每个网络应用WAR文件都包含同一个jar文件的副本。这是否意味着该jar文件中的类将在JVM中多次加载,对于它所在的每个WAR文件加载一次?从那以后,如果我在这样的类中有一个静态同步方法,它是否只在它存在的web应用程序中的线程之间同步,但不与不同jar文件中不同jar文件中的同一类中的相同方法同步WAR文件?(希望这个问题有意义,如有必要会澄清)。如果是这种情况,我认为最好的解决方案是从每个WAR文件中删除jar文件并将其部署到服务器上的共享类路径文件夹中? 最佳答案 Java类加载器通常通过以

java - 当同一个类存在于同一服务器上的不同应用程序中时,类加载如何工作?

我在应用服务器上运行了多个网络应用,每个网络应用WAR文件都包含同一个jar文件的副本。这是否意味着该jar文件中的类将在JVM中多次加载,对于它所在的每个WAR文件加载一次?从那以后,如果我在这样的类中有一个静态同步方法,它是否只在它存在的web应用程序中的线程之间同步,但不与不同jar文件中不同jar文件中的同一类中的相同方法同步WAR文件?(希望这个问题有意义,如有必要会澄清)。如果是这种情况,我认为最好的解决方案是从每个WAR文件中删除jar文件并将其部署到服务器上的共享类路径文件夹中? 最佳答案 Java类加载器通常通过以

java - Java Bootstrap 类加载器是如何加载的?

这个问题在这里已经有了答案:WhatloadstheJavasystemclassloader?(4个回答)关闭5年前。在Java中,据说所有的类都由类加载器加载。首先,引导类加载器会加载所有rt.jar类。我仍然很困惑,因为Classloader也是一个类,所以谁会加载这个BootStrapClassloader? 最佳答案 答案:当JVM启动时,会运行一段特殊的机器代码来加载系统类加载器。此机器代码称为Bootstrap/Primordial(或有时-Null)类加载器。它根本不是一个Java类,就像所有其他类加载器一样。引导类