问题描述:
代码
idea启动没问题,能正常访问到文件,但是打包后就无法访问到了
2020-12-03 22:22:33.027 INFO 1764 --- [ main] com.jy.DesignApplication : Starting DesignApplication v0.0.1-SNAPSHOT on E8BP5A2FE9DHB6I with PID 1764 (C:\Users\Administrator\Desktop\design-0.0.1-SNAPSHOT.jar started by Administrator in C:\Users\Administrator\Desktop)
2020-12-03 22:22:33.030 INFO 1764 --- [ main] com.jy.DesignApplication : No active profile set, falling back to default profiles: default
java.io.FileNotFoundException: file:\C:\Users\Administrator\Desktop\design-0.0.1-SNAPSHOT.jar!\BOOT-INF\classes!\myConfig.properties (文件名、目录名或卷标语法不正确。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at com.jy.config.MyAoutoConfig.getPerson(MyAoutoConfig.java:17)
at com.jy.config.MyAoutoConfig$$EnhancerBySpringCGLIB$$3d8b12ee.CGLIB$getPerson$0(<generated>)
at com.jy.config.MyAoutoConfig$$EnhancerBySpringCGLIB$$3d8b12ee$$FastClassBySpringCGLIB$$cd9d1717.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331)
at com.jy.config.MyAoutoConfig$$EnhancerBySpringCGLIB$$3d8b12ee.getPerson(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
原因分析:
idea本地访问的时候,他是以正常文件目录来访问的,但是经过打成jar包之后,整个文件打包成了一个压缩包,java.io的文件句柄是无法直接访问压缩文件的内部的内容的
解决方案:
java.io文件句柄无法访问绝对路径的压缩文件,getResource方法返回值是个Url,所以解决方案有三种:
this.getClass().getResource("/myConfig.properties").openStream()
this.getClass().getClassLoader().getResource("myConfig.properties").openStream()
this.getClass().getClassLoader().getResourceAsStream("myConfig.properties")
下面是通过getResourceAsStream方式获取的解决方案的结果
替换之后idea本地正常启动
替换之后打包也正常启动