Tag: classloader

如何find哪个jar子和按什么顺序由类加载器加载?

我在其他地方找不到这个问题的明确答案,所以我会在这里尝试: 有没有某种方式(编程或其他)来获取应用程序类加载器加载的JAR /类的列表,按照它们加载的精确顺序? 通过应用程序类加载器我指的是在应用程序服务器(WLS,WAS,JBoss …)中加载EAR应用程序的类加载器,但显然它适用于任何类加载器。 所以,一般来说,我想知道的是由指定的类加载器加载的JAR的列表和顺序。 不是单独的类,这很容易通过调用classloader.getPackages()来find,而是由此类加载器加载的JAR文件的列表。

如何从classloader获取classpath?

我正在使用一些第三方代码,当给定一个'-classpath'命令行参数没有设置java.class.path,而只是创build一个类加载器,将命令行上指定类path的项目的所有URL添加到类加载器,然后将其设置为上下文类加载器。 在我编写的这段代码的插件类中,我得到了这个类加载器的一个实例,不知何故需要用它来取回底层的类path,以便我可以在调用JavaCompiler.getTask(…)中使用它。 )并编译一些其他的代码。 然而似乎没有办法从ClassLoader中获取ClassPath,因为java.class.path未被设置,我似乎无法访问应用程序最初被调用的基础类path…任何想法?

this.getClass()。getClassLoader()。getResource(“…”)和NullPointerException

我已经在eclipse helios中创build了一个具有单个子模块的最小Maven项目。 在src / test / resources文件夹中,我放置了一个文件“install.xml”。 在文件夹src / test / java中,我创build了一个包含一个类的包: @Test public void doit() throws Exception { URL url = this.getClass().getClassLoader().getResource("install.xml"); System.out.println(url.getPath()); } 但是当我作为一个junit运行代码4unit testing我只是得到一个NullPointerException。 这已经工作了一百万次。 有任何想法吗? 我遵循这个指南: http://www.fuyun.org/2009/11/how-to-read-input-files-in-maven-junit/ 但仍然得到相同的错误。

OSGi,Java模块化和拼图

所以从昨天早上起,我甚至都不知道OSGi是什么。 OSGi只是一个口号,我不断地看到一遍又一遍,所以我终于留出了一些时间来刷它。 它实际上看起来好像很酷,所以我想先说(logging)我不是在任何方面都反OSGi,这也不是什么“OSGi-bashing”的问题。 在这一天结束的时候,OSGi似乎已经在本质上解决了Java模块化的JSR 277问题,该模块认识到JAR文件规范存在缺陷,可能导致在特定情况下的名称空间parsing和类加载问题。 OSGi也做了很多其他很酷的东西,但从我所能确定的,这是它最大的吸引力(或其中之一)。 对我来说 – 作为一个相当新的Java EE开发者(现在几年),我们在2011年,目前生活在Java 7时代,而且这些类加载问题仍然存在是非常令人难以置信的。 尤其是在一个应用程序服务器上可能有数百个JAR的企业环境中,其中许多依赖于不同版本的相互之间以及所有正在运行(或多或less)的JAR。 我的问题: 就像我在OSGi中一样感兴趣,尽pipe我想要开始了解它,看看它是否可以用于我的项目,但我没有时间坐下来学习一些大型的,至less现在。 那么当这些问题出现时,非OSGi开发者应该做些什么呢? 目前存在哪些Java (Oracle / Sun / JCP)解决scheme? 为什么从J7剪切拼图? Jigsaw明年将在J8上实现的社区有多less? 即使它不是Java平台的一部分,是否有可能为您的项目获得Jigsaw? 我想我在这里问的是一个恐慌,阴谋和facepalm的组合。 现在我终于明白OSGi是什么了,我只是不知道Jigsaw已经花费了20多年的时间才能实现,而如何才能从发行版本中解放出来。 这似乎是基本的。 作为开发人员,我也很好奇我的解决scheme是什么,OSGi。 另外, 注意 :我知道这不是一个“ 纯编程 ”types的问题,但是在你们中的一些人的鼻子弯曲变形之前,我想(再次logging下来)我故意把这个问题所以。 那是因为我没有任何东西,只是对我的同胞们极为尊重,而且我正在寻找一些我每天都在这里潜伏的“IT之神”的build筑层面的答案。 但是,对于那些绝对坚持用一些代码段来支持SO问题的人: int x = 9; (感谢任何能够衡量这个OSGi / Jigsaw / classloader / namespace / JAR的东西!)

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

我知道这对于有经验的编程人员来说可能是一个愚蠢的问题。 但我有一个库(一个HTTP客户端),我的项目中使用的一些其他框架/jar子需要。 但他们都需要不同的主要版本,如: httpclient-v1.jar => Required by cralwer.jar httpclient-v2.jar => Required by restapi.jar httpclient-v3.jar => required by foobar.jar 类加载器是否足够聪明,以某种方式将它们分开? 最有可能不? Classloader如何处理这个问题,以防三个jar子中的Class是相同的。 哪一个被加载,为什么? Classloader只拾取一个jar子,还是混合任意的类? 例如,如果一个类是从Version-1.jar加载的,那么从同一个类加载器加载的所有其他类将全部进入相同的jar? 你如何处理这个问题? 有没有什么把“jar子”合并到“required.jar”中的一些技巧,这样就可以被Classloader看作是“一个单元/包”,或者以某种方式被链接?

确定一个类来自哪个JAR文件

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

find从哪里加载Java类

有没有人知道如何编程地找出java classloader实际上从哪里加载类? 我经常在类path变得很长的大型项目上工作,手动search不是真正的select。 我最近遇到了类加载器加载类的不正确版本的问题 ,因为它位于两个不同位置的类path中。 那么如何让类加载器告诉我磁盘上的实际类文件来自哪里? 编辑:如果类加载实际上由于版本不匹配(或其他)而无法加载类,那么无论如何,我们可以找出它在读取之前尝试读取哪个文件?

在Java / Maven中处理“Xerces hell”?

在我的办公室里,仅仅提到Xerces这个词就足以激起开发者的愤怒。 粗略地看一下其他Xerces上的SO问题似乎表明,几乎所有的Maven用户都被这个问题“触动”了一些。 不幸的是,理解这个问题需要对Xerces的历史有一些了解。 历史 Xerces是Java生态系统中使用最广泛的XMLparsing器。 几乎每个使用Java编写的库或框架都以某种身份使用Xerces(即使不是直接传递)。 包括在官方二进制文件中的Xercesjar子至今还没有版本。 例如,Xerces 2.11.0实现jar被命名为xercesImpl.jar而不是xercesImpl-2.11.0.jar 。 Xerces团队不使用Maven ,这意味着他们不会将正式版本上传到Maven Central 。 Xerces曾经作为一个单独的jar ( xerces.jar )被释放 ,但被分成了两个jar,一个包含API( xml-apis.jar ),另一个包含这些API( xml-apis.jar )的实现。 许多较老的Maven POM仍然声明对xerces.jar的依赖。 在过去的某个时候,Xerces也是以xmlParserAPIs.jar发布的,一些较老的POM也依赖它。 那些将他们的jar部署到Maven仓库的人分配给xml-apis和xercesImpl jar的版本通常是不同的。 例如,xml-apis可能会被赋予1.3.03版本,而xercesImpl可能会被赋予2.8.0版本,即使两者都来自Xerces 2.8.0。 这是因为人们经常使用它实现的规范版本来标记xml-apis jar。 这里有一个非常好的,但不完整的细分。 更为复杂的是,Xerces是JRE中包含的用于XML处理的Java API的参考实现(JAXP)中使用的XMLparsing器。 实现类在com.sun.*命名空间下重新打包,这使得直接访问这些实现类非常危险,因为它们可能在某些JRE中不可用。 但是,并非所有的Xercesfunction都通过java.*和javax.* API公开; 例如,没有暴露Xerces序列化的API。 除此之外,几乎所有的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> 尽pipeB的jar比A的jar版本更低,但Maven并不知道它们是相同的,因为它们具有不同的groupId 。 […]

可执行jar中Class.getResource()和ClassLoader.getResource()的奇怪行为

我理解Class.getResource()和ClassLoader.getResource()之间的区别是什么? 并从自己的代码,那 getClass().getResource("/path/image.png") 是相同的 getClass().getClassLoader().getResource("path/image.png") 张贴无法读取jar文件中的图像显示使用的问题 getClass().getClassLoader().getResource("path/image.png") 在一个可执行的jar文件中返回null,而 getClass().getResource("/path/image.png") 返回正确的URL。 Since Class.getResource()在删除前导斜杠后委托给ClassLoader.getResource() ,所以我期望这些调用是相同的,但显然它们不是这种情况。 即使当一个特殊的类加载器被附加到特定的类时,对于每个调用仍然应该是一样的,这同样会导致相同的行为。 所以,问题是: 是否有任何明显的情况下,下面的代码为第一个调用返回null,但第二个调用的正确的URL? package com.example; import java.net.URL; public class ResourceTest { public void run() { URL iconUrl1 = getClass().getClassLoader().getResource("path/image.png"); System.out.println("ClassLoader.getResource(\"path/image.png\"): " + iconUrl1); URL iconUrl2 = getClass().getResource("/path/image.png"); System.out.println("Class.getResource(\"/path/image.png\"): " + iconUrl2); } public static void main(String[] args) { ResourceTest app = new […]

如何获取jar文件中的类名称?

我有一个JAR文件,我需要得到这个JAR文件中所有类的名字。 我怎样才能做到这一点? 我GOOGLE了一下,看到了一些关于JarFile或Java ClassLoader但我不知道如何做到这一点。