您的位置:首页 > 编程语言 > Java开发

Java 读取 jar 包文件

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

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

@SuppressWarnings("unchecked")
private Map<String, JSONObject> 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<String, JSONObject> map = Maps.newHashMap();
for (Object obj : jsonArray) {
Map<String, JSONObject> 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<ContextRefreshedEvent> {

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

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

private static final Map<String, JSONObject> serviceWindowMap = Maps.newHashMap();

public static Map<String, JSONObject> 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<String, JSONObject> jsonMap = JSON.parseObject(obj.toString(), Map.class);
serviceWindowMap.putAll(jsonMap);
}
}

@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
// 防止初始化多次
if(contextRefreshedEvent.getApplicationContext().getParent() != null){
return;
}
initData();
}
}

测试 ok!

参考1: http://hxraid.iteye.com/blog/483115

参考2:https://blog.csdn.net/wo541075754/article/details/71720984
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Spring Java