网站首页 > java教程 正文
假设我要将java项目中部分class和配置打成一个jar,然后jar放到其他项目,当访问jar的方法时,jar可以访问自己jar里面的配置文件,这样怎样实现呢?
有人会问为什么要将配置文件打人到jar中呢?可以将配置写错java常量啊,或配置交给调用者去配置啊?
其实也是为了满足这样一种场景:某天我要提供一个jar给其他项目组使用,我也不希望他们去搞懂相关的配置,他们只要调用jar的方法就好了,所以配置交给调用者沟通的使用的成本会比较高;
那为什么不写在jar的常量类里面呢?这就会引发另外一个问题,比如配置里面的某个key的值某天要修改了,那整个jar都不能使用,必须外部重新编译打包新的jar来覆盖了,但是写成配置文件一起打入到jar就不同,jar可以通winRaR的方式打开,修改配置文件,然后保存winRaR就可以了,这样是不是很方便!
假设项目的结构为:
在开发环境(未打jar前),读取propertis文件方式为
public static void main(String[] args) throws Exception {
InputStream res = null
res = AlibabaMQTT.class.getResourceAsStream("/mqtt-tcp-prop.properties");
properties.load(res);//jar读取
System.out.println(" testv="+properties.getProperty("testv"));
}
此时mqtt-tcp-prop.properties在classpath /下面,直接使用/读取即可
当我们将AlibabaMQTT.java和mqtt-tcp-prop.properties打成jar,导入到其他项目中,同样运行:
AlibabaMQTT.main(args);
意外的事情发生,出现空指针异常,为什么呢?
我们观察下jar的结构:
打成的jar,mqtt-tcp-prop.properties多包了有一层resources文件夹,尽管src/main/resources是classpath,但是打成的jar却多了resources,所以,jar获取配置的方式需要改成下面的:
public static void main(String[] args) throws Exception {
InputStream res = null
res = AlibabaMQTT.class.getResourceAsStream("/resources/mqtt-tcp-prop.properties");
properties.load(res);//jar读取
System.out.println(" testv="+properties.getProperty("testv"));
}
可是问题来了,换成上面的,在开发环境运行又要报错了,两者相互矛盾,所以,我们可以再改进,兼容两者的方式:
public static void main(String[] args) throws Exception {
InputStream res = null
//打成jar的读取方式
InputStream res = AlibabaMQTT.class.getResourceAsStream("/resources/mqtt-tcp-prop.properties");
System.out.println("jar模式运行 res="+res);
if(res==null) {
//eclipse中的读取方式,即未打成jar的读取方式
res = AlibabaMQTT.class.getResourceAsStream("/mqtt-tcp-prop.properties");
System.out.println("jar模式运行获取失败,此时为非jar模式运行 res="+res);
}
properties.load(res);//jar读取
System.out.println(" testv="+properties.getProperty("testv"));
}
这样就实现了jar读取配置的方式,当然这里有不完美地方,就是读取方式有两种,能不能让eclipse打包后的jar,配置文件不包含目录resources呢?
这个楼主暂时还没有找到方法,希望各位提供宝贵的建议 [握手][握手]!
猜你喜欢
- 2024-10-01 「每日分享」内存文件映射方式读取超大文件踩坑题解析
- 2024-10-01 尚学堂百战程序员之读写配置文件教程
- 2024-10-01 Spark中读写不同类型文件(如何改文件的读写类型)
- 2024-10-01 Java中文件使用流操作基础知识(java文件流不关闭的后果)
- 2024-10-01 Java 读取txt文件生成Word文档(java读取txt文件存为字符串)
- 2024-10-01 零基础编程培训系列JAVA入门课程第十一讲Java文件处理
- 2024-10-01 SpringBoot读取.yml配置文件最常见的两种方式
- 2024-10-01 java IO流读取文件并统计文件中各个字符出现的次数
- 2024-10-01 Java读取配置文件config.properties
- 2024-10-01 常见Java问题及笔试题(十八)——说一说代码中读取文件的事
你 发表评论:
欢迎- 最近发表
-
- 五,网络安全IDA Pro反汇编工具初识及逆向工程解密实战
- 「JAVA8」- Lambda 表达式(java lambda表达式原理)
- 深入探讨Java代码保护:虚拟机保护技术的新时代
- Nginx反向代理原理详解(图文全面总结)
- 逆向拆解日本IT,哪些Java技术栈薪资溢价高
- mybatis 逆向工程使用姿势不对,把表清空了,心里慌的一比
- Spring Boot集成ProGuard轻松实现Java 代码混淆, Java 应用固若金汤
- 从 Java 代码逆向工程生成 UML 类图和序列图
- 人与人相处:尊重是标配,靠谱是高配,厚道是顶配
- Windows系统安装日期如何修改(windows10怎么修改安装日期)
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)