Java 读取 jar 包文件
2018-07-01 17:13
316 查看
最近,做项目遇到这样一个需求,需要在 spring 容器启动后,从文件初始化一些数据。编码完成后,我在本地测试的时候,没有问题,文件可以读到。但是项目部署到 web 容器后,就报错,找不到文件。
开始的 demo 如下,文件在 resources 文件夹下:
这套代码在本地测试是没有问题的。线上就不行了,后来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()方法来获取。(具体为何要这样做,请参照后面引用的博客,我就不重复造轮子了)
最终代码如下:
测试 ok!
参考1: http://hxraid.iteye.com/blog/483115
参考2:https://blog.csdn.net/wo541075754/article/details/71720984
开始的 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
相关文章推荐
- core java ziptest 第12章如何从zip文件或者jar文件中读取数据
- Java读取jar中的文件
- 随心所欲学Java,文件读取问题研究,Jar包内文件读取 推荐
- java 如何读取jar包外的properties文件(转)
- java 从jar中读取文件 三种方法<Enumeration>
- JavaIO——java如何读取jar包自身内部的属性文件
- 读取excel文件(jxl.jar包简介/java操作excel jxl.jar下载地址)
- java读取jar包内的文件
- java读取jar包里文件内容
- java 读取配置文件或者图片文件,然后打jar包的问题
- java 从jar包中读取资源文件
- 从Java档案(JAR)中读取文件
- Java读取Jar中资源文件
- java读取jar里的文件
- 从 Java 档案(JAR) 中读取文件
- Java用jdom.jar解析读取XML文件信息
- java.util.jar 读取文件
- java 从jar中读取文件 三种方法<Enumeration>
- java读取jar中指定的文件
- java 从jar包中读取资源文件