我们正在创build多个子类加载器,将多个子应用程序加载到Java应用程序“容器”中,进行热部署的原型devise。 当一个特定类加载器的类path发生了变化(例如,jar被添加,删除,更新)时,旧的类加载器被抛弃(未引用),并为jar的新类path创build一个新的类加载器。 更新类path后,触发热部署,我们采取了堆转储。 堆转储(使用内存分析器)表明旧的类加载器没有被垃圾回收。 父类加载器中的某些类正在caching旧的类加载器。 下面的东西被调用来清除这些caching: java.lang.ResourceBundle.clearCache(classLoader); org.apache.commons.logging.LogFactory.release(classLoader); java.beans.Introspector.flushCaches(); 即使在清除了上述caching之后,旧的加载器仍然没有被垃圾收集。 其余的类加载器引用如下: 由类加载器加载的类 java.lang.Package由类加载器本身创build java.lang.ProtectionDomain由类加载器本身创build 以上所有都是类加载器中的循环引用,它应该触发一个垃圾回收。 我不知道为什么不是。 有人知道为什么旧的类加载器仍然不被垃圾收集,即使是循环引用?
最近遇到了一些让我思考的代码。 有什么区别: Class theClass = Class.forName("SomeImpl"); SomeImpl impl = (SomeImpl)theClass.newInstance(); 和: Class theClass = ClassLoader.loadClass("SomeImpl"); SomeImpl impl = (SomeImpl)theClass.newInstance(); 他们是同义词吗? 在某些情况下,一个比另一个更好? 使用这两种方法做什么和不做什么? 提前致谢。
我想列出Java类加载器加载我的类的顺序。 如果我使用-verbose参数,它会列出它加载的每一个接口/类,包括吨接口,如Serializable,exception等。有没有办法来调整这个输出,所以它只显示哪些类加载在我的主要方法被定义为?
开发大量基于XML的Java应用程序,最近我在Ubuntu Linux上遇到了一个有趣的问题。 我的应用程序使用Java插件框架 ,似乎无法将dom4j创build的XML文档转换为Batik的 SVG规范实现。 在控制台上,我知道发生了一个错误: 线程“AWT-EventQueue-0”中的exceptionjava.lang.LinkageError:接口中的加载器约束违规itable初始化:何时parsing方法org.apache.batik.dom.svg.SVGOMDocument.createAttribute(Ljava / lang / String;)Lorg / W3C / DOM /的Attr;” org / apache / batik / dom / svg / SVGOMDocument的类加载器(org / java / plugin / standard / StandardPluginClassLoader的实例),org / w3c / dom / Document在org.apache.batik.dom.svg.SVGDOMImplementation.createDocument(SVGDOMImplementation.java:149)org.dom4j.io.DOMWriter签名中使用的typesorg / w3c / dom / Attr具有不同的Class对象.createDomDocument(DOMWriter.java:361)at org.dom4j.io.DOMWriter.write(DOMWriter.java:138) 我认为这个问题是由JVM的原始类加载器和插件框架部署的类加载器之间的冲突引起的。 据我所知,不可能为框架指定一个类加载器来使用。 有可能破解它,但是我宁愿采取一些不积极的方法来解决这个问题,因为(无论出于何种原因)它只发生在Linux系统上。 你们有没有遇到过这样的问题,并且有什么想法如何解决这个问题,或者至less能够解决问题的核心问题?
我刚刚开始学习Java的内部架构。 我大致了解了类加载的概念,它在jvm运行时加载所需的类,当没有find类时,抛出ClassNotFoundException并且特定的类加载器加载类引用的类。 有人可以请清楚地解释类加载的stream程,即在下面的示例Java代码中引导类加载和用户定义类加载的序列。 import java.io.File; public class Sample { public static void main(String[] args) { String fileName = "sample"; File file = new File(fileName); file.isFile(); } } 另外我从一个参考资料中了解到“ classloader维护它所加载的类的名字空间”。 通过命名空间,这是否意味着类的字面名称? 也有人可以解释的含义/优势呢?
我在独立应用程序中使用Maven,并且想要将所有依赖关系打包到库文件夹中的JAR文件中,如其中一个答案中所述: 我怎样才能创build一个使用Maven的依赖关系的可执行JAR? 我希望我的最终JAR文件有一个包含依赖关系作为JAR文件的库文件夹,而不是像Maven层次结构一样在.m2文件夹中放置依赖关系的maven-shade-plugin 。 那么,实际上当前的configuration做我想要的,但我在运行应用程序时加载JAR文件有问题。 我无法加载类。 这是我的configuration: <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>copy-dependencies</id> <phase>prepare-package</phase> <goals> <goal>copy-dependencies</goal> </goals> <configuration> <outputDirectory>${project.build.directory}/classes/lib</outputDirectory> <overWriteReleases>false</overWriteReleases> <overWriteSnapshots>false</overWriteSnapshots> <overWriteIfNewer>true</overWriteIfNewer> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</classpathPrefix> <mainClass>com.myapp.MainClass</mainClass> </manifest> </archive> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.6</source> <target>1.6</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-dependency-plugin</artifactId> <executions> <execution> <id>install</id> <phase>install</phase> […]
dynamic加载类时,何时适合使用 Class.forName("SomeClass"); 何时使用 ClassLoader.getSystemClassLoader().loadClass("SomeClass"); 或者,他们是做同样的事情的两种方式吗?
在Java中通过类加载器从jar中获取的资源上构buildFile实例有没有办法? 我的应用程序使用jar(默认)或运行时(用户input)指定的文件系统目录中的一些文件。 我正在寻找一个一致的方式 a)以stream的forms加载这些文件 b)将这些文件分别列在用户定义的目录或jar中的目录中 编辑:显然,理想的做法是远离java.io.File完全。 有没有办法从类path加载一个目录,并列出其内容(其中包含的文件/实体)?
在一些简单的句子中,什么是Java ClassLoader,什么时候使用,为什么? 好的,我读了一篇wiki文章。 ClassLoader加载类。 好。 所以如果我包含jar文件并导入,一个ClassLoader可以完成这个工作。 我为什么要打扰这个ClassLoader? 我从来没有用过它,不知道它存在。 问题是,为什么ClassLoader类存在? 而且,你如何在实践中使用它? (我知道有这种情况。)
search带注释类的整个类path的最佳方法是什么? 我在做一个库,我想允许用户注释他们的类,所以当Web应用程序启动时,我需要扫描整个类path的特定注释。 你知道一个图书馆或Java设施来做到这一点吗? 编辑:我正在考虑像Java EE 5 Web服务或EJB的新function。 您使用@WebService或@EJB注释您的类,系统在加载时查找这些类,以便它们可以远程访问。