今天被这个Classloader搞死了。起因是这样的:
public static void staticMethod(){
String resource = ClassLoader.getSystemResource("a.xml").toString();
}
然后a.xml已经加入了CLASSPATH。
整个代码是写在一个Ant的Task里,然后Ant里调用(事先<taskdef>)
这个时候在Eclipse调用build.xml,没有问题。
但是在命令行下调用ant,出错,找不到,返回null。
于是到Task里的execute里测试一下
public void execute(){
String resource = getClass().getClassLoader().getResource("a.xml").toString();
}
两个环境都找到了。
看来是static的函数里ClassLoader比较不一样,是systemClassLoader估计。
然后这么写:
public static void staticMethod(){
String resource = new Object().getClass().getClassLoader().getResource("a.xml").toString();
}
居然报出一个NullPointerException,原来是返回的ClassLoader为空。马上查了一下ClassLoader的源码(IBM JDK),发现如果某个instance的classloader=systemClassLoader就返回空。什么道理啊。。。
这么写,也不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getResource("a.xml").toString();
}
这么写,还是不行
public static void staticMethod(){
String resource = ClassLoader.getSystemClassLoader().getParent().getResource("a.xml").toString();
}
嗯,把那个类换成Singleton,发现居然可以了。
后来发现要这么写:
public class Test{
public static void staticMethod(){
String resource = new Test().getClass().getClassLoader().getResource("a.xml").toString();
}
}
才OK。。。
Eclipse自已有ClassLoader,Ant自己又有ClassLoader。才有这么多问题。
接下来我想搞的OSGi,每个Bundle都有自己的classloader实例。。。。晕死了。。。
分享到:
相关推荐
org.apache.tools.ant.AntClassLoader org.apache.tools.ant.BuildException org.apache.tools.ant.DynamicElement org.apache.tools.ant.NoBannerLogger org.apache.tools.ant.PropertyHelper org.apache....
深入Java 2 SDK.pdf`可能涉及的是Java与其他工具和技术的集成,如与微软Office的交互、使用Visual Studio .NET管理Java应用、Ant构建工具的使用以及对Java 2 SDK的深入理解,这些都可能间接地涉及到ClassLoader的...
通过研究`ClassLoader`源码,我们可以更深入地理解Java的运行机制,这对于解决一些高级问题,如类冲突、模块化开发等具有重要价值。同时,自定义`ClassLoader`也是Java企业级应用、服务器插件框架以及动态部署场景中...
以下是一些关于Apache Ant的关键知识点: 1. **XML配置**:Ant使用XML来定义构建脚本,这使得构建过程具有可读性和跨平台兼容性。XML文件中的元素如`<project>`、`<target>`、`<task>`等,分别代表项目、目标和任务...
Java的类加载机制分为三个主要的加载器:启动类加载器(Bootstrap ClassLoader)、扩展类加载器(Extension ClassLoader)和应用类加载器(Application ClassLoader)。了解类加载器的工作原理有助于理解和解决类...
在Java世界中,`URLClassLoader`是一个非常关键的类,它是`ClassLoader`的子类,主要用于从指定的URL(统一资源定位符)加载类和资源。这篇博客文章“URLClassLoader初体验”可能深入探讨了如何使用`URLClassLoader`...
DexClassLoader的parent设置为宿主程序的classloader,即可将主程序和插件程序的class贯通 2、插件apk的资源 通过构造插件apk的AssetManager和Resouce类即可。 本项目最关键一点功能、也是和网上其他插件项目...
7. **专门的依赖分析工具**:如Ivy、Apache Ant的`depend`任务,以及一些第三方工具,可以帮助分析和解决依赖问题。 在给定的文件列表中,`WebappClassLoader`相关的内部类表明它们与类加载和资源查找有关。这些类...
Java的类加载器分为Bootstrap ClassLoader、Extension ClassLoader和App ClassLoader,它们按照双亲委派模型进行工作,保证了类的唯一性。 4. **字节码**: 字节码是Java程序的二进制表示,每条字节码指令对应一个...
描述中的重复同样表明了与jar包相关的主题,但没有提供具体细节,可能是涉及到jar包的合并、打包、运行或依赖管理等。 标签“jar包2jar包2jar包2jar包2”进一步确认了讨论的主题是围绕jar包操作。这可能涉及到开发...
在 Tomcat 中,我们可以使用 Ant Task 和 Maven 来实现自动化构建和部署。在 pom.xml 文件中,我们可以配置 Ant Task 和 Maven 的参数,例如: ```xml <groupId>org.codehaus.mojo <artifactId>jspc-maven-...
3. **类加载机制**:在Java中,类的加载是由ClassLoader完成的。`JarClassSearcher`可能需要模拟部分加载过程,仅获取类名而无需实际加载类。 4. **字符串匹配**:搜索功能的核心是字符串匹配,可以使用Java内置的`...
- **序言**:作者从个人经历出发,表达了对于插件体系结构的兴趣,并提到了早期接触的一些工具,如Ant和Maven,这表明作者对于构建工具及模块化开发有着深厚的兴趣和一定的了解。 #### 二、体验OSGi - **2.1 需求...
这些插件可以监测源代码的改变,并实时更新到运行中的应用,从而避免了传统开发中频繁重启的问题。但要注意,这些插件的使用需要额外的配置和可能的许可证成本。 **Java类热加载的实现**:热加载的核心在于类加载器...
7. **工具应用**:开发者经常会用到一些工具来处理ZIP和JAR文件,比如`jar`命令行工具、Ant、Maven等构建工具,以及IDE如Eclipse和IntelliJ IDEA内置的打包和部署功能。这些工具能够方便地创建、修改和提取ZIP和JAR...
开发者在使用时,需要通过Android的`ClassLoader`加载这个库,并调用相应的API来启动和配置服务器。 `i-jetty-master`则可能是i-jetty项目的源码,这对于深入理解其工作原理和进行定制开发非常有帮助。源码通常包括...
6. **编译构建系统**:OpenJDK的构建系统使用的是Makefile和Ant,这使得开发者可以了解Java项目的构建流程,包括如何编译、测试和打包源码。 7. **性能分析和调试工具**:OpenJDK 8包含了JConsole、JVisualVM等工具...
带通配符的classpath使用“ClassLoader”的“Enumeration<URL>getResources(String name)”方法来查找通配符之前的资源,然后通过模式匹配来获取匹配的资源。 三、classpath的使用 classpath用在哪里?在编译打包...
总之,通过研究"openjdk-7-fcs-src-b147-27_jun_2011.zip"中的源码,开发者可以深化对Java运行时环境的理解,提升解决问题的能力,并为参与Java生态系统的贡献打下坚实基础。对于Java程序员而言,这是一次难得的深入...