读取项目中的xml文件
代码:
SAXReader reader = new SAXReader();
Document document = reader.read(ResourceUtils.getFile("classpath:application-validation.xml"));
Element root = document.getRootElement();
但是抛出 FileNotFound异常
java.io.FileNotFoundException: class path resource [application-validation.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/usr/local/conet/cloud/conet-ds/DS_V200R002B020.jar!/BOOT-INF/classes!/application-validation.xml
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:217)
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:180)
at com.validation.ValidationConfigParser.parse(ValidationConfigParser.java:39)
at com.validation.runner.ValidationRunner.run(ValidationRunner.java:28)
at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:797)
at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:781)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:335)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1255)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1243)
at com.ds.ConetDsApplication.main(ConetDsApplication.java:26)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
原因:
项目打成jar包后,资源文件也存在于jar包中,文件的绝对路径是jar:file:/D:/sunmnet/JetBrains/workspace/xxx/target/xxx-1.0-SNAPSHOT.jar!/BOOT-INF/classes!/XXX.cfg
但在运行过程中,spring是不允许直接访问jar包内的文件的,所以会报错。
解决:
采用读取流的方式访问文件:
ClassPathResource resource = new ClassPathResource("application-validation.xml");
InputStream inputStream = resource.getInputStream();
Document document = reader.read(inputStream);
Element root = document.getRootElement();