Spring boot JAR包XML文件的读取

可能大家在开发过程中都会遇到读取静态文件的操作,用于在程序启动过程中的配置加载,那如何去读取,如何去实现这个问题,代码如何编写呢?

实现

JAVA的静态文件我们一般都是放在 src/main/resources目录下面:
例如这次所遇到的问题如下图

xml.jpg

因为我需要在工具 jar包中读取这两个 xml文件,来实现对系统配置的加载。然后就遇到问题了。

问题

在使用如下代码时:

Resource resource = new ClassPathResource("xxx.xml");
File file = resource.getFile();

在本地调试时完全没有问题,然后就认为代码完美。然而当程序 JAR包部署到linux环境上时出现了错误:

class path resource [xxxx] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:xxxx.jar!/BOOT-INF/classes!xxxx

出于好奇心得驱动断点进去看resource.getFile()到底是什么,截图断点如下:

Dingtalk_20210707170812.jpg

进入断点发现:这个竟然是jar
查看报错的信息,找到这个类的这个方法org.springframework.util.ResourceUtils#getFile(),啊哈,原来如此:

Dingtalk_20210707171117.jpg

当获取的文件协议不是file的时候会抛出异常:

throw new FileNotFoundException(description + " cannot be resolved to absolute file path because it does not reside in the file system: " + resourceUrl);

这样这个问题就知道原因了。

解决

ResouceUtils.getFile()是专门用来加载非压缩和Jar包文件类型的资源,所以它根本不会去尝试加载Jar中的文件,要想加载Jar中的文件,只要用可以读取jar中文件的方式加载就可以了。

            String txt = "";
            Resource resource = new ClassPathResource("/xxx.xml");
            BufferedReader JarUrlProcReader = new BufferedReader(new InputStreamReader(resource.getInputStream()));
            StringBuilder buffer = new StringBuilder();

            String JarUrlProcStr;
            while((JarUrlProcStr = JarUrlProcReader.readLine()) != null) {
                buffer.append(JarUrlProcStr);
                log.info("producerUrl" + JarUrlProcStr);
            }

            txt = buffer.toString();

然后根据需要去处理你的字符串数据就可以了。
因为我用的是XML文件格式所以我使用:

            Document doc = DocumentHelper.parseText(txt);
            Element root = doc.getRootElement();
            List elementList = root.elements();
            String rootName = root.getName();

你可能感兴趣的:(Spring boot JAR包XML文件的读取)