网站首页 > 精选教程 正文
假设我要将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-31 Java 8 列出目录中的所有文件 java统计所有目录下文件个数
- 2024-10-31 Eclipse 创建 Java 项目 eclipse创建java项目有红叉
- 2024-10-31 Java常用工具下载路径 java下载地址在哪
- 2024-10-31 以下是一份较为完整的 Java 语言学习路径规划:
- 2024-10-31 java中读取properties文件最简单的方法
- 2024-10-31 基于Java的学生课程选课管理系统:项目目录结构 #vue
- 2024-10-31 java 代码里读取jar包下resources目录下的文件
- 2024-10-31 JAVA之多级目录下查找文件中是否含有某个字符串功能实现
- 2024-10-31 现互联网大厂程序员,给你一份Java开发学习路径
- 2024-10-31 「JAVA」三种方式加载本地资源文件:绝对路径、类路径、当前路径
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)