java 读取 jar_Java 读取 jar 包文件

最近,做项目遇到这样一个需求,需要在 spring 容器启动后,从文件初始化一些数据。编码完成后,我在本地测试的时候,没有问题,文件可以读到。但是项目部署到 web 容器后,就报错,找不到文件。

开始的 demo 如下,文件在 resources 文件夹下:

@SuppressWarnings("unchecked")

private Map buildMap() throws FileNotFoundException {

URL resource = JsonTest.class.getClassLoader().getResource("serviceWindow.json");

JSONReader jsonReader;

JSONArray jsonArray = null;

try {

jsonReader = new JSONReader(new FileReader(new File(resource.getPath())));

String jsonString = jsonReader.readString();

jsonArray = JSONArray.parseArray(jsonString);

} catch (FileNotFoundException e) {

e.printStackTrace();

}

if (null == jsonArray) {

throw new FileNotFoundException("file not exists");

}

Map map = Maps.newHashMap();

for (Object obj : jsonArray) {

Map jsonMap = JSON.parseObject(obj.toString(), Map.class);

map.putAll(jsonMap);

}

System.out.println(map);

return map;

}

这套代码在本地测试是没有问题的。线上就不行了,后来debug 发现,项目部署后,要读的配置文件已经打到 jar 包中去了。jar 包是一个单独的文件,而不是文件夹,绝对不可能通过 file:/D:/.../dn-visitor-web/target/dn-visitor/WEB-INF/lib/dn-visitor-biz-1.0-SNAPSHOT.jar!/serviceWindow.json" 这种形式的文件URL来定位 serviceWindow.json.  这时候可以通过Class类的getResourceAsStream()方法来获取。(具体为何要这样做,请参照后面引用的博客,我就不重复造轮子了)

最终代码如下:

/**

* created by Demon, on 2018/6/29

*/

@Service

public class ServiceWindowManager implements ApplicationListener {

private static final String path = "/json/serviceWindow.json";

private static final Logger logger = LoggerFactory.getLogger(ServiceWindowManager.class);

private static final Map serviceWindowMap = Maps.newHashMap();

public static Map getServiceWindowMap() {

return serviceWindowMap;

}

@SuppressWarnings("unchecked")

private void initData() {

InputStream is;

BufferedReader br;

StringBuilder sb;

try {

is = this.getClass().getResourceAsStream(path);

br = new BufferedReader(new InputStreamReader(is, "utf-8"));

sb = new StringBuilder();

String line;

while ((line = br.readLine()) != null) {

sb.append(line);

}

is.close();

br.close();

} catch (Exception e) {

logger.error("@ServiceWindowManager.initData Exception ", e);

return;

}

JSONArray jsonArray = JSONArray.parseArray(sb.toString());

for (Object obj : jsonArray) {

Map jsonMap = JSON.parseObject(obj.toString(), Map.class);

serviceWindowMap.putAll(jsonMap);

}

}

@Override

public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {

// 防止初始化多次

if(contextRefreshedEvent.getApplicationContext().getParent() != null){

return;

}

initData();

}

}

测试 ok!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值