Questions tagged «classloader»

类加载器是一个对象,负责以Java加载类。

11
在Java / Maven中处理“ Xerces地狱”?
在我的办公室里,仅提及Xerces一词就足以引起开发人员的致命愤怒。粗略地浏览SO上的其他Xerces问题似乎表明,几乎所有Maven用户在某个时候都被该问题“感动”。不幸的是,了解问题需要对Xerces的历史有一点了解... 历史 Xerces是Java生态系统中使用最广泛的XML解析器。几乎所有用Java编写的库或框架都以某种能力使用Xerces(如果不是直接使用,则是透明地使用)。 到目前为止,官方二进制文件中包含的Xerces jar 尚未进行版本控制。例如,Xerces 2.11.0实现jar被命名为xercesImpl.jarnot xercesImpl-2.11.0.jar。 Xerces团队不使用Maven,这意味着他们不将正式发行版上载到Maven Central。 Xerces过去以单个jar(xerces.jar)的形式发布,但被拆分为两个jar,一个包含API(xml-apis.jar),一个包含这些API的实现(xercesImpl.jar)。许多较旧的Maven POM仍声明依赖于xerces.jar。在过去的某个时候,Xerces也发布为xmlParserAPIs.jar,某些较早的POM也依赖于此。 将jar部署到Maven存储库的人分配给xml-apis和xercesImpl jar的版本通常是不同的。例如,即使xml-apis都来自Xerces 2.8.0,也可以给它xml版本1.3.03,给xercesImpl版本2.8.0。这是因为人们经常用实现的规范版本标记xml-apis jar。还有就是这是一个非常不错的,但不完全击穿这里。 使事情复杂化的是,Xerces是JRE中包含的XML处理Java API(JAXP)的参考实现中使用的XML解析器。实现类在com.sun.*名称空间下重新打包,这使得直接访问它们很危险,因为它们在某些JRE中可能不可用。但是,并非所有的Xerces功能都通过java.*和javax.*API 公开;例如,没有API公开Xerces序列化。 令人困惑的是,几乎所有servlet容器(JBoss,Jetty,Glassfish,Tomcat等)都随Xerces一起放在其一个或多个/lib文件夹中。 问题 解决冲突 由于上述某些(或全部)原因,许多组织在其POM中发布和使用Xerces的自定义版本。如果您的应用程序很小并且仅使用Maven Central,那么这并不是真正的问题,但是对于Artifactory或Nexus代理多个存储库(JBoss,Hibernate等)的企业软件而言,这很快就成为一个问题: 例如,组织A可能发布xml-apis为: <groupId>org.apache.xerces</groupId> <artifactId>xml-apis</artifactId> <version>2.9.1</version> 同时,组织B可能发布以下内容jar: <groupId>xml-apis</groupId> <artifactId>xml-apis</artifactId> <version>1.3.04</version> 尽管B的jar版本低于A的版本jar,但Maven不知道它们是相同的工件,因为它们具有不同 groupId的。因此,它不能执行冲突解决,并且两个都 jar将作为已解决的依赖项包括在内: 类加载器地狱 如上所述,JRE在JAXP RI中与Xerces一起提供。将所有Xerces Maven依赖项标记为<exclusion>s或as 会很好<provided>,您所依赖的第三方代码可能会或可能不会与您使用的JDK的JAXP中提供的版本一起使用。另外,您还可以将Xerces jars放在servlet容器中以应对。这给您提供了许多选择:是否删除servlet版本,并希望您的容器在JAXP版本上运行?离开servlet版本更好,希望您的应用程序框架在servlet版本上运行是否更好?如果上面概述的一两个未解决的冲突成功地渗入了您的产品(在大型组织中很容易发生),您很快就会陷入类加载器地狱中,想知道类加载器在运行时选择的是哪个版本的Xerces,是否将在Windows和Linux中选择相同的jar(可能不是)。 解决方案? 我们试过标志认证的所有Xerces的Maven依赖作为<provided>或作为<exclusion>,但这是给难以执行(尤其是大型团队)的文物有这么多的别名(xml-apis,xerces,xercesImpl,xmlParserAPIs,等)。此外,我们的第三方库/框架可能无法在JAXP版本或servlet容器提供的版本上运行。 我们如何最好地使用Maven解决这个问题?我们是否必须对依赖项进行这种细粒度的控制,然后依靠分层的类加载?是否有某种方法可以全局排除所有Xerces依赖关系,并强制我们所有的框架/库使用JAXP版本? 更新:Joshua Spiewak已将Xerces构建脚本的修补程序版本上载到XERCESJ-1454,从而可以上载到Maven Central。投票/观看/贡献这个问题,让我们一劳永逸地解决这个问题。

18
如何在运行时动态加载JAR文件?
为什么用Java这么难?如果要使用任何类型的模块系统,则需要能够动态加载JAR文件。有人告诉我,有一种方法可以通过编写自己的方法来完成ClassLoader,但是对于(至少在我看来)应该像调用带有JAR文件作为其参数的方法一样容易的事情,这是很多工作。 对执行此操作的简单代码有何建议?
308 java  jar  classloader 

13
在运行时扫描Java批注[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 3个月前关闭。 改善这个问题 在整个类路径中搜索带注释的类的最佳方法是什么? 我正在做一个库,我想允许用户注释他们的类,所以当Web应用程序启动时,我需要扫描整个类路径以查找某些注释。 您知道执行此操作的库或Java工具吗? 编辑:我正在考虑类似Java EE 5 Web服务或EJB的新功能。您使用@WebService或注释类,@EJB系统在加载时会找到这些类,因此可以远程访问它们。


14
从Java中的类路径加载资源的URL
在Java中,您可以使用相同的API,但使用不同的URL协议来加载各种资源: file:///tmp.txt http://127.0.0.1:8080/a.properties jar:http://www.foo.com/bar/baz.jar!/COM/foo/Quux.class 这很好地将资源的实际加载与需要资源的应用程序分离开来,并且由于URL只是一个字符串,因此资源加载也很容易配置。 是否有使用当前类加载器加载资源的协议?这类似于Jar协议,除了我不需要知道资源来自哪个jar文件或类文件夹。 我Class.getResourceAsStream("a.xml")当然可以使用来做到这一点,但这需要我使用不同的API,因此需要对现有代码进行更改。我希望能够在仅通过更新属性文件就可以为资源指定URL的所有地方使用它。
197 java  url  classloader 

7
Class.getResource()和ClassLoader.getResource()有什么区别?
我想知道Class.getResource()和之间有什么区别ClassLoader.getResource()? 编辑:我特别想知道在文件/目录级别是否涉及任何缓存。如“类别列表中缓存目录列表吗?” AFAIK以下基本上应该做同样的事情,但事实并非如此: getClass().getResource() getClass().getClassLoader().getResource() 我在摆弄一些报表生成代码时发现了这一点,该代码WEB-INF/classes/从该目录中的现有文件中创建了一个新文件。使用Class中的方法时,可以使用找到部署getClass().getResource()时存在的文件,但是当尝试获取新创建的文件时,我收到了一个空对象。浏览目录清楚地表明新文件在那里。文件名前面有一个正斜杠,如“ /myFile.txt”中所示。 另一方面,的ClassLoader版本getResource()确实找到了生成的文件。从这种经验看来,目录列表存在某种形式的缓存。我是对的,如果是这样,在哪里记录? 从API文档开始Class.getResource() 查找具有给定名称的资源。搜索与给定类关联的资源的规则由该类的定义类加载器实现。此方法委派给该对象的类加载器。如果此对象是由引导类加载器加载的,则该方法将委托给ClassLoader.getSystemResource(java.lang.String)。 对我来说,这是“ Class.getResource实际上正在调用其自己的类加载器的getResource()”。这和做一样getClass().getClassLoader().getResource()。但这显然不是。有人可以为我提供一些启发性的东西吗?

11
查找从何处加载Java类
有谁知道如何以编程方式找出java类加载器实际从何处加载类? 我经常在大型项目中使用类路径,并且手动搜索并不是一个好的选择。我最近遇到了一个问题,其中类加载器正在加载不正确的类版本,因为它位于两个不同位置的类路径上。 那么,如何让类加载器告诉我实际的类文件来自磁盘上的什么地方? 编辑:如果类加载器由于版本不匹配(或其他原因)而实际上无法加载该类,该如何在读取它之前找出我们要读取的文件呢?

3
JVM标志CMSClassUnloadingEnabled实际做什么?
CMSClassUnloadingEnabled除了一些非常模糊的高级定义(例如“摆脱PermGen问题”(不是,btw))之外,我一生无法找到Java VM标志实际作用的定义。 我查看了Sun / Oracle的站点,甚至选项列表都没有真正说明它的作用。 基于该标志的名称,我猜测CMS垃圾收集器默认情况下不会卸载类,并且该标志将其打开-但我不确定。

7
卸载Java中的类?
我有一个自定义的类加载器,以便桌面应用程序可以动态地从需要与之交谈的AppServer加载类。我们这样做是因为这样做所需的罐子数量太可笑了(如果我们想发货的话)。如果我们没有在运行时从AppServer库动态加载类,我们还将遇到版本问题。 现在,我遇到一个问题,需要与两个不同的AppServer进行交谈,发现根据我首先加载的类,我可能会严重损坏...是否有任何方法可以在不杀死JVM的情况下强制卸载该类? 希望这有意义
174 java  classloader 

7
什么是Java ClassLoader?
简单地说,什么是Java ClassLoader?何时使用Java?为什么? 好的,我读了一篇维基文章。ClassLoader加载类。好。因此,如果我包含jar文件并导入,则ClassLoader可以完成这项工作。 我为什么要打扰这个ClassLoader?我从未使用过它,也不知道它的存在。 问题是,为什么ClassLoader类存在?而且,您如何在实践中使用它?(案例存在,我知道。)
174 java  classloader 

4
确定类来自哪个JAR文件
我现在不在IDE面前,只是在看API规范。 CodeSource src = MyClass.class.getProtectionDomain().getCodeSource(); if (src != null) { URL jar = src.getLocation(); } 我想确定一个类来自哪个JAR文件。这是这样做的方式吗?
154 java  jar  class  classloader 

6
Java资源作为文件
Java中是否有办法在通过类加载器从jar检索的资源上构造File实例? 我的应用程序使用jar(默认)或运行时指定的文件系统目录(用户输入)中的某些文件。我正在寻找一种一致的方式 a)将这些文件作为流加载 b)分别列出用户定义的目录或jar中的目录中的文件 编辑:显然,理想的方法是完全远离java.io.File。有没有办法从类路径加载目录并列出其内容(包含在其中的文件/实体)?

5
Java,Classpath,Classloading =>同一jar /项目的多个版本
我知道对于经验丰富的编码人员来说,这可能是一个愚蠢的问题。但是我有一个库(http客户端),我的项目中使用的其他一些框架/罐也需要。但它们都需要不同的主要版本,例如: 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中吗? 您如何处理这个问题? 是否有某种技巧可以以某种方式将罐子“合并”到“ required.jar”中,从而使罐子被Classloader或以某种方式链接为“一个单元/包装” ?


8
如何使用Maven将所有必需的JAR文件放入最终JAR文件中的库文件夹中?
我在独立应用程序中使用Maven,并且要将所有依赖项打包到库文件夹中的JAR文件中,如此处的答案之一所述: 如何使用Maven创建具有依赖项的可执行JAR? 我希望最终的JAR文件具有一个库文件夹,其中包含作为JAR文件的依赖项,而不是像maven-shade-plugin将.m2文件夹中的Maven层次结构那样的依赖项以文件夹形式放置的依赖项。 好吧,实际上当前的配置可以实现我想要的功能,但是在运行应用程序时加载JAR文件时遇到了问题。我无法加载课程。 这是我的配置: <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> …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.