资源描述
项目中,经常把一部分功能独立出来,做一个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 文件
a. 在项目下新建文件 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包间也加空格
最后一行为空行
截图如下:
b. 通过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:定义配置文件的绝对路径
a. 工程src下新建目录config,存放配置文件;(以前都是直接存放在src目录下的);目录结构如下:
b. 修改获取配置文件的方式,代码如下:
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目录才存放配置文件,目录结构如下:
同样测试成功。
总结:
System.getProperty("user.dir") 获得项目的绝对路径,然后拼装配置文件的路径。
参考日志:
http://hnsswjjxy-163-
http://lijun0349-163-
如何读取JAR包外的properties文件及打成jar包后无法读取到jar包内的properties文件
2011年06月21日 星期二 19:24
打成jar包后无法读取到jar包内的properties文件
发现在eclipse里一切正常,但打成jar包后就无法读取到properties文件了。
之前的程序是这样获取配置文件的:
Thread.currentThread().getContextClassLoader().getResource("").getPath() +filename+".properties") 来获取properties文件,但发现一运行就报错.后来将代码改成:
this.getClass().getClassLoader().getResourceAsStream(filename+".properties")
一切正常~
关于java 的 classloader 还是有点概念不清,需要补补~~
以下内容转载自:
http://hnsswjjxy-163-
一般在项目中使用properties配置文件的时候都将相关的properties文件放在src目录下,在将该app打包生成jar后,相应的properties配置文件生成在jar包中,这样的话要修改配置文件又要重新打jar包,那是相当的麻烦。。
既然这么麻烦,你肯定想将配置文件放在其他的目录下,生成的jar包内不包含相应的配置文件,修改配置文件无需重新打包,没错,下面就是一种解决方案了。
读取jar包内配置文件:
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/configfilename.properties");
读取jar包外配置文件:
String filePath = System.getProperty("user.dir") + "/conf/configfilename.properties";
InputStream in = new BufferedInputStream(new FileInputStream(filePath));
展开阅读全文