恩,有好几个问题一直没有搞清楚,哪为大人帮忙解释下。我用eclipse开发。src
                  |____packagename--*.java
                  |_____config.properties
                  |_____applicationContext.xml
上面是目录结构,配置文件都放在src目录下。
类中加载配置文件代码:
contextPaths = new String[] {"applicationContext.xml"};
ctx = new ClassPathXmlApplicationContext(contextPaths);
读取配置文件
URL path = ClassLoader.getSystemResource("config.properties");
pro.load(new FileInputStream(path.toURI().getPath()));
在eclipse调试的时候一切正常。但是,当我发布的时候把.class文件都放到jar里面,我不想把配置文件,包括Spring的配置文件都放入和jar同级的目录,结构如下。
folder
|_____demo.jar
|_____aplicationContext.xml
|_____config.properties
|_____lib目录所有有几个问题:
1.我要把配置文件放到jar同级的目录,我上面的读取配置文件的代码,应该怎么修改?2.我试着把配置文件一起打包的jar文件中,Spring的配置文件正常,但是读取properties的代码URL path = ClassLoader.getSystemResource("config.properties");
pro.load(new FileInputStream(path.toURI().getPath()));
出错,提示。demo.jar!/config.properties找不到。搞不太清楚,这些路径到底什么关系请高手解答。

解决方案 »

  1.   

    把你的加载文件方式改了,你的是从类路径ClassPath改成从文件路径或,系统路径,然后就可以写成绝对路径了,这样文件放在哪里都能找的到
      

  2.   

    类路径默认是找src下的,系统文件路径默认是找tomcat的bin下的,文件路径就是读文件中的
      

  3.   

    这个用ClassLoader来解决:ClassLoader对应的根目录在src的父目录,这个问题是eclipse读文件时的默认目录与jar包读的时候的区别造成的:
    String fileSeparator = System.getProperty("file.separator"); // 为了在linux和windows下通用,因为两个系统的分隔符不一样,一个是/,另一个是\,这个东西让系统来为我们自己决定好一些。
    InputStream is = this.getClass().getClassLoader().getResourceAsStream("src" + fileSeparator + "packageName" + fileSeparator + "fileName");
    这样做,应该没有问题了。
      

  4.   

    (九天玄狐) 说的绝对路径不可行。Inhibitory() 说的,没有完全满足要求,我已经做成jar了,怎么处理?而且Spring读取配置文件怎么修改呢?谢谢二位。。
    继续,等待。。
      

  5.   

    Inhibitory() 说的,没有完全满足要求,我已经做成jar了,怎么处理?而且Spring读取配置文件怎么修改呢?
    ---------------------------------
    这没办法了,你的程序里面的写法就不对,当然没办法了,因为程序里读取的代码就错了,外面怎么做也不行。
      

  6.   

    看来你spring用的不是很好啊
    Resource rs = new FileSystemResource("这里可以是绝对路径");
    BeanFactory factory = new XmlBeanFactory(rs);
            接口 hello = (接口)factory.getBean("hello");
      

  7.   

    ApplicationContext context = new FileSystemXmlApplicationContext("这里也可以是绝对路径");
    (...)context.getBean("...");
      

  8.   

    ctx = new ClassPathXmlApplicationContext(contextPaths);
    这个不是可以在读取ClassPath路径中的文件吗?可不可以理解?
    我的意思,是不是可以在demo.jar的MANIFEST.MF文件中class-path中加入applicationContext.xml,然后打包的时候,不把上面提到的配置文件加入到jar中,把这些文件放到和demo.jar同目录。to zxh2208180(九天玄狐):恩,不是很熟悉,照着文档,第一次在使用Spring.刚才没有理解到你的意思,绝对路径应该可以实现的。我试试...
    Inhibitory() :如果程序有什么问题,请帮忙指出。多谢二位的耐心
      

  9.   

    还有这个:InputStream is = this.getClass().getClassLoader().getResourceAsStream("src" + fileSeparator + "packageName" + fileSeparator + "fileName");我的文件就和Src在同层次路径,我应该是InputStream is = this.getClass().getClassLoader().getResourceAsStream(filename).但是不成功。还是说找不到文件。
      

  10.   

    比如工程文件夹名字叫JPro,下面有文件夹src,this.getClass().getClassLoader()取得的是JPro这个文件夹处的位置。
      

  11.   

    恩,得到了的绝对路径,问题大部分解决了。只是有点麻烦好像,我在eclipse调试的时候是个路径,然后我打包成jar又是个路径,能不能不改变程序?还有使用了Spring的ResourceBundleMessageSource,但是同样路径问题,message.properties放到src中没有问题,但是,放到src同一级目录的话,<value>message</value>这个地方怎么写?
    有办法?<bean id="messageSource" class="org.springframework.context.support.Resourc eBundleMessageSource">
    <property name="basename"><value>message</value></property>
    </bean>
      

  12.   

    我另开一贴,问下这个Spring的问题。
      

  13.   

    http://community.csdn.net/Expert/topic/5642/5642873.xml?temp=8.073062E-02
      

  14.   

    http://community.csdn.net/Expert/topic/5642/5642097.xml?
      

  15.   

    建一个src文件夹,把配置文件放入,结构跟打包前完全一致.跟工程的结构也要一致.应该没有问题,代码测试过的话不用修改.
      

  16.   

    另外,你是以src打包还是以packagename为根目录的,应该也有影响的吧.我的理解是,只要文件目录结构一致了,其他的不用考虑.