讀取項目中的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();