草庐IT

classloader

全部标签

具有多个类加载器的 Java ServiceLoader

使用ServiceLoader的最佳实践是什么?在具有多个类加载器的环境中?该文档建议在初始化时创建并保存单个服务实例:privatestaticServiceLoadercodecSetLoader=ServiceLoader.load(CodecSet.class);这将使用当前上下文类加载器初始化ServiceLoader。现在假设这个片段包含在一个使用Web容器中的共享类加载器加载的类中,并且多个Web应用程序想要定义自己的服务实现。这些不会在上面的代码中得到,甚至有可能使用第一个webapps上下文类加载器初始化加载器并向其他用户提供错误的实现。总是创建一个新的Service

java - 从 lib 目录加载 jar 文件的顺序

谁能解释从Tomcat中的lib目录加载jar文件的顺序?是按字母顺序吗?随机?还是其他顺序? 最佳答案 这一切都在Tomcat'sClassLoadingHOW-TO中进行了描述.它不一定按字母顺序。如果您观察到这种行为,那么如果您打算让您的web应用程序在服务器之间保持可移植性,则应该绝对不依赖它。例如,Tomcat6“巧合地”订购了它,但Tomcat8没有。总结一下,加载顺序如下:Bootstrap/系统(JRE/lib,然后是server.loader)webapp库(WEB-INF/classes,然后是WEB-INF/l

java - 从 lib 目录加载 jar 文件的顺序

谁能解释从Tomcat中的lib目录加载jar文件的顺序?是按字母顺序吗?随机?还是其他顺序? 最佳答案 这一切都在Tomcat'sClassLoadingHOW-TO中进行了描述.它不一定按字母顺序。如果您观察到这种行为,那么如果您打算让您的web应用程序在服务器之间保持可移植性,则应该绝对不依赖它。例如,Tomcat6“巧合地”订购了它,但Tomcat8没有。总结一下,加载顺序如下:Bootstrap/系统(JRE/lib,然后是server.loader)webapp库(WEB-INF/classes,然后是WEB-INF/l

java - 如何创建可插入的 Java 程序?

我想创建一个可以用插件扩展的Java程序。我该怎么做?我应该在哪里寻找?我有一组插件必须实现的接口(interface),它应该在一个jar中。程序应该在相对(程序)文件夹中监视新的jar,并以某种方式注册它们。虽然我确实喜欢EclipseRCP,但我认为它对于我的简单需求来说太过分了。Spring也是一样,反正我也要去看看,还是试试看吧。但是,我还是希望找到一种方法来尽可能简单地创建我自己的插件“框架”。 最佳答案 我已经为我过去编写的软件做过这个,它非常方便。我首先创建了一个我所有的“插件”类都需要实现的接口(interface

java - 如何创建可插入的 Java 程序?

我想创建一个可以用插件扩展的Java程序。我该怎么做?我应该在哪里寻找?我有一组插件必须实现的接口(interface),它应该在一个jar中。程序应该在相对(程序)文件夹中监视新的jar,并以某种方式注册它们。虽然我确实喜欢EclipseRCP,但我认为它对于我的简单需求来说太过分了。Spring也是一样,反正我也要去看看,还是试试看吧。但是,我还是希望找到一种方法来尽可能简单地创建我自己的插件“框架”。 最佳答案 我已经为我过去编写的软件做过这个,它非常方便。我首先创建了一个我所有的“插件”类都需要实现的接口(interface

java - 何时以及如何将 java 类加载器标记为垃圾收集?

我们正在创建多个子类加载器,以将多个子应用程序加载到Java应用程序“容器”中,对热部署进行原型(prototype)设计。当特定类加载器的类路径发生更改(即添加、删除、更新jar)时,旧的类加载器将被丢弃(未引用),并为新的jar类路径创建一个新的类加载器。更新类路径后,触发热部署,我们进行了堆转储。堆转储(使用内存分析器)表明旧的类加载器没有被垃圾收集。父类加载器中的某些类正在缓存旧的类加载器。调用了以下内容来清除这些缓存:java.lang.ResourceBundle.clearCache(classLoader);org.apache.commons.logging.LogF

java - 何时以及如何将 java 类加载器标记为垃圾收集?

我们正在创建多个子类加载器,以将多个子应用程序加载到Java应用程序“容器”中,对热部署进行原型(prototype)设计。当特定类加载器的类路径发生更改(即添加、删除、更新jar)时,旧的类加载器将被丢弃(未引用),并为新的jar类路径创建一个新的类加载器。更新类路径后,触发热部署,我们进行了堆转储。堆转储(使用内存分析器)表明旧的类加载器没有被垃圾收集。父类加载器中的某些类正在缓存旧的类加载器。调用了以下内容来清除这些缓存:java.lang.ResourceBundle.clearCache(classLoader);org.apache.commons.logging.LogF

java - 如何从类加载器获取类路径?

我正在使用一些第三方代码,当给定“-classpath”命令行参数时,它不会设置java.class.path,而是创建一个类加载器,为命令行指定类路径上的项目添加所有url到类加载器,然后将其设置为上下文类加载器。在我编写的这段代码的插件类中,我得到了这个类加载器的一个实例,并且不知何故需要使用它来取回底层的类路径,以便我可以在调用JavaCompiler.getTask(...)并即时编译一些其他代码。但是,似乎无论如何都无法从ClassLoader获取ClassPath,并且由于java.class.path未设置,我似乎无法访问应用程序最初调用的底层类路径......有什么想法

java - 如何从类加载器获取类路径?

我正在使用一些第三方代码,当给定“-classpath”命令行参数时,它不会设置java.class.path,而是创建一个类加载器,为命令行指定类路径上的项目添加所有url到类加载器,然后将其设置为上下文类加载器。在我编写的这段代码的插件类中,我得到了这个类加载器的一个实例,并且不知何故需要使用它来取回底层的类路径,以便我可以在调用JavaCompiler.getTask(...)并即时编译一些其他代码。但是,似乎无论如何都无法从ClassLoader获取ClassPath,并且由于java.class.path未设置,我似乎无法访问应用程序最初调用的底层类路径......有什么想法

Java 详细类加载

我正在尝试列出Java类加载器加载我的类的顺序。如果我使用-verbose参数,它将列出它加载的每个接口(interface)/类,包括大量接口(interface),如可序列化、异常等。有没有办法调整这个输出,所以它只显示哪些类是加载在我的主方法定义的类中? 最佳答案 我猜你最好的选择是做以下事情:在您的main方法开始后和结束之前输出一些固定文本。将verbose输出通过管道传输到文件中使用less或grep之类的东西从main方法中查找加载在两个标签之间的类。这里有一个类似的问题和一些答案:Isthereawaytogetwh