日期:2014-05-20  浏览次数:20775 次

关于jar和配置文件的路径的问题,请高手解答,200分献上。
恩,有好几个问题一直没有搞清楚,哪为大人帮忙解释下。

我用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找不到。

搞不太清楚,这些路径到底什么关系。。。请高手解答。

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

------解决方案--------------------
我通常都是使用绝对路径,虽然长,但是不会出现路径出错
------解决方案--------------------
ApplicationContext context = new FileSystemXmlApplicationContext( "这里也可以是绝对路径 ");
(...)context.getBean( "... ");
------解决方案--------------------
天啊!杂你们说的我都不懂呢?
------解决方案--------------------
用绝对路径,虽然麻烦点 但 "一捞永逸 "
------解决方案--------------------
建一个src文件夹,把配置文件放入,结构跟打包前完全一致.跟工程的结构也要一致.应该没有问题,代码测试过的话不用修改.