Java如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件

项目中,经常把一部分功能独立出来,做一个java  project,然后打成jar包供其他项目引用。这时候,如果jar包中需要读取配置文件信息,则很少把该配置打进jar包,因为它不方便修改,更多都是采用jar包读取外部配置文件。

案例:

项目工程名:auth  -- 很明显,做鉴权使用的

项目配置文件:init.properties   log4j.properties

init.properties 很明显是读取数据库配置的,log4j.properties就不解释啦

driver=oracle.jdbc.driver.OracleDriver

url=jdbc:oracle:thin:@192.168.6.234:1530:billdb

user=dw

passwd=dw123

testsql=select sysdate from dual

项目引用jar包:

lib/servlet-api.jar

lib/log4j-1.2.15.jar

lib/commons-collections-3.1.jar

lib/commons-logging-1.0.4.jar

lib/commons-pool.jar

lib/ojdbc14.jar

读取配置文件示例:

public class Config {

     private static Properties properties;

     private static Logger logger = Logger.getLogger(Config.class);

 

     static {

         try {

              properties = new Properties();

              // 读取SRC下配置文件 --- 属于读取内部文件

              properties.load(Config.class.getResourceAsStream("/init.properties"));

             

         } catch (IOException e) {

              logger.error("读取配置信息出错!");

         }

     }

 

     public static String getObject(String prepKey) {

         return properties.getProperty(prepKey);

     }

 

     public static void main(String[] agrs) {

         logger.info(Config.getObject("testsql"));

     }

}

目录结构如下:

解决方案I:自定义 manifest.mf 文件

  1. 在项目下新建文件 manifest.mf,内容如下:

Manifest-Version: 1.0

Class-Path: lib/servlet-api.jar lib/log4j-1.2.15.jar lib/commons-collections-3.1.jar lib/commons-logging-1.0.4.jar lib/commons-pool.jar lib/ojdbc14.jar

 

解释:

Manifest-Version: 1.0  版本号,没啥特殊含义,但一定要有;

Class-Path: 所有引用的jar包

注意:

每个“:”后面都要加空格,Class-Path中每个jar包间也加空格

最后一行为空行

截图如下:

  1. 通过Eclipse 到处jar包

右键项目工程----Export --à选择Java下 JAR File,下一步

选择工程的src目录(其他的lib,.setting都不选中),去掉两个配置文件的选项(配置文件外部读取),选择导出jar包的位置;

注意:右侧的.classpath这些都不要选中,只把src下的java文件打包。

下一步

下一步:选中自定义的manifest.mf文件,完成

测试:

新建项目,导入刚刚生成的jar包和jar需要的所有包(把jar包所在工程lib下所有引用jar拿过来),在src下写入配置文件,目录结构如下:

测试:

public class Demo1 {

     /**

      * @param args

      */

     public static void main(String[] args) {

         System.out.println(Config.getObject("testsql"));

         ConnectionUtil.main(null);

     }

}

测试结果:

log4j:WARN No such property [datePattern] in org.apache.log4j.RollingFileAppender.

select sysdate from dual

14:07:15,297  INFO ConnectionUtil:87 - ====== 当前系统日期是:2011-07-26 12:00:00

 

这就是方案1,总结:

自定义 manifest.mf 文件,配置清楚jar所需要的所有lib。

当其他系统引用该jar时,相当于把包拉到系统中(jar的内容相当于系统自定义的),它读取的配置文件就是从系统的classpath下读取。

 

方案II:定义配置文件的绝对路径

  1. 工程src下新建目录config,存放配置文件;(以前都是直接存放在src目录下的);目录结构如下:

  1. 修改获取配置文件的方式,代码如下:

 public class Config {

     private static Properties properties;

     private static Logger logger = Logger.getLogger(Config.class);

 

     static {

         try {

              PropertyConfigurator.configure(System.getProperty("user.dir") + "/config/log4j.properties"); 

              properties = new Properties();

              // 读取SRC下配置文件 --- 属于读取内部文件

              // properties.load(Config.class.getResourceAsStream("/init.properties"));

              // 读取系统外配置文件 (即Jar包外文件) --- 外部工程引用该Jar包时需要在工程下创建config目录存放配置文件

              String filePath = System.getProperty("user.dir")

                       + "/config/init.properties";

              InputStream in = new BufferedInputStream(new FileInputStream(

                       filePath));

              properties.load(in);

         } catch (IOException e) {

              logger.error("读取配置信息出错!",e);

         }

     }

 

     public static String getObject(String prepKey) {

         return properties.getProperty(prepKey);

     }

 

     public static void main(String[] agrs) {

         logger.info(Config.getObject("testsql"));

     }

}

看代码:

设置log4j.properties的位置

PropertyConfigurator.configure(System.getProperty("user.dir") + "/config/log4j.properties");

设置init.properties的位置

String filePath = System.getProperty("user.dir")

                       + "/config/init.properties";

导出项目jar包:

同上面的导出方式,只导出src下的java文件(config,lib等不选)

使用默认生成的manifest.mf文件

导出成功。

在项目中引用,同上面的一样,但是在引用项目中,需要在src目录下创建config目录才存放配置文件,目录结构如下:

同样测试成功。

 

总结:

1. System.getProperty("user.dir") 获得项目的绝对路径,然后拼装配置文件的路径。

2. 读取jar包内配置文件:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("/configfilename.properties");  

3. 读取jar包外配置文件:

String filePath = System.getProperty("user.dir") + "/conf/configfilename.properties";     

InputStream in = new BufferedInputStream(new FileInputStream(filePath));  

  • 4
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值