问题备忘: 将工程打包成jar包运行,就报java.io.FileNotFoundException: class path resource错误

最近在在使用@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())
复制代码
相关文章
相关标签/搜索