最近在在使用@Value注入文件碰到以下问题: 工程在在IntelliJ IDEA开发环境里正常运行,可是一旦将工程打包成jar包运行,就报java.io.FileNotFoundException: class path resource错java
代码以下:经过@Value将resource目录下test/billingconfig-file.xml目录注入到Resource上spring
@Value("classpath:test/billingconfig-file.xml")
private Resource resourceFile; // 注入计费点文件资源
JAXBContext context = JAXBContext.newInstance(BillingModelList.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
BillingModelList billingModelList = (BillingModelList) unmarshaller.unmarshal(resourceFile.getFile());
复制代码
代码在IntelliJ IDEA开发环境里正常运行,可是一旦将工程打包成jar包运行,就提示以下错误:bash
java.io.FileNotFoundException: class path resource [test/billingconfig-file.xml] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/C:/Users/Administrator/Desktop/tmp/other/sp-bap-simulator-1.5.17.RELEASE.jar!/BOOT-INF/classes!/test/billingconfig-file.xml
at org.springframework.util.ResourceUtils.getFile(ResourceUtils.java:215)
at org.springframework.core.io.AbstractFileResolvingResource.getFile(AbstractFileResolvingResource.java:52)
at im.yixin.spbap.logic.support.PayContext.init(PayContext.java:63)
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:497)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleElement.invoke(InitDestroyAnnotationBeanPostProcessor.java:366)
at org.springframework.beans.factory.annotation.InitDestroyAnnotationBeanPostProcessor$LifecycleMetadata.invokeInitMethods(InitDestroyAnnotationBeanPostProcessor.java:311)
复制代码
缘由是由于unmarshaller.unmarshal传入的参数是File, 在IntelliJ IDEA里运行时,billingconfig-file.xml是个独立的文件,能够被File访问到, 可是将工程打包成jar包运行,billingconfig-file.xml被封装到jar包中了,不是一个独立文件了,此时确定没法使用File访问到。 了解了缘由,咱们能够将传递unmarshaller.unmarshal()方法的参数从File变成InputStream就能够了ide
将
unmarshaller.unmarshal(resourceFile.getFile());
修改成:
unmarshaller.unmarshal(resourceFile.getInputStream());
复制代码
完整代码以下:ui
@Value("classpath:test/billingconfig-file.xml")
private Resource resourceFile; // 注入计费点文件资源
JAXBContext context = JAXBContext.newInstance(BillingModelList.class);
Unmarshaller unmarshaller = context.createUnmarshaller();
BillingModelList billingModelList = (BillingModelList) unmarshaller.unmarshal(resourceFile.getInputStream())
复制代码