如果普通应用程序仅仅读一个配置文件:
pro.load(ClassLoader.getSystemResourceAsStream("dbConfig.properties"));
语句就行.我用的jBuilder,但是如果构建web程序 (tomcat 6)
就只能用:
pro.load(this.getClass().getResourceAsStream("dbConfig.properties"));
否则出空指针异常.并且发现应用程序和web程序的 dbConfig.properties 文件的路径不相同,
应用程序需要把配置文件在classpath下,
web程序需要放到class文件的同级目录下.(是不是应用程序制定了classpath的关系?)疑问多啊!
应为我要用web构建,但是只想读取配置文件一边.本来该语句是写在静态块的 ,
但是用:ClassLoader就出空指针异常啊.jdk文档看不出来啊,想知道原因!!!!高手帮忙解惑,讲讲本质吧!!万分感谢!!还是我出错了?

解决方案 »

  1.   

    在UI应用的所说的system目录为项目的主目录
    而web项目则不同,如tomcat则为“tomcat_home”
    所以返回的是null我比较支持用第二种方法,
    org.csj.resource.Property
    .load(Property.class.getClassLoader().getResourceAsStream("org/csj/resource/text/text.properties"));
      

  2.   

    两个检索路径方式大致相同,getResourceAsStream也可以指定路径,比如/dbConfig.properties,表示根路径,/com/dbConfig.properties标识在com包下,getSystemResourceAsStream会搜索所有classpath,这两个方法如果用到Application中是一样的效果,但用到web上后就不同了,应该是因为class Loader发生了改变造成的
      

  3.   

    可能是:
    getSystemResourceAsStream是在jvm类路径下找资源。
    应用程序:getResourceAsStream是在应用程序相对路径或者绝对路径找资源;web程序:getResourceAsStream是在应用服务器类路径或者绝对路径下找资源。
      

  4.   

    记得sun有篇专门介绍classloader的文章,标题包含“forName”关键字,比较详细,搜搜看吧,再结合tomcat的classloader相关文档,你应该就能理解了要解决你的问题也不困难,你只要弄一个listener,在web应用程序启动时候读入配置,保证只会执行一次
      

  5.   

    ClassLoader就是类加载器,它负责加载你的类,当然和类的目录相关的资源它也是可以加载的
    一般来说,只要你的路径对了,它是一定可以加载进来的
    也就是说你的资源文件和类文件放到起一起的话,肯定可以通过调用pro.load(this.getClass().getResourceAsStream("dbConfig.properties"));