如何获取jar包resources文件路径
目录
- 获取jar包resources文件路径
- Springboot获取jar包中resources资源目录下的文件
- 阿萨斯多问题现象:
- 问题分析:
- 解决方法:
获取jar包resources文件路径
Java项目发布到jar之后找不到文件路径
本地: String path = this.getClass().getClassLoader().getResource(XMLPath).getPath();打成jar发布服务器不管用了
解决办法:
//相对路径
private final String xmlPath= "/jenkinspipeline/PipelineConfig.xml";
public StringBuildjser propertyResolverXml(String xmlPath) {
InputStream resourceAsStream = XmlLocalUtils.class.getResourceAsStream(xmlPath);//读取内容
StringBuilder xmlStr = new StringBuilder();
BufferedReader read = null;
try {
read = new BufferedReader(new InputStreamReader(resourceAsStream));//转成bufferreader按行读取
String tempStr;
while ((tempStr = read.readLine()) != null) {
xmlStr.append(tempStr);
}
read.close();
} catch (Exception ex) {
log.error("解析文件异常:", ex);
throw new NativeSphereCicdException(NativeSphereCicdEnum.PROPERTYRESOLVERXML_EXCEPTION);
}
return xmlStr;
}
补充:
Springboot获取jar包中resources资源目录下的文件
阿萨斯多问题现象:
今天在项目中遇到一个业务场景,需要用到resources资源目录下的文件,然后就在思考一个问题:
当项目打成jar后,Springboot要如何获取resources资源目录下的文件呢?
问题分析:
如题,如何在项目打成jar包之后,在代码中依然能够获取到jar包中resources资源目录下的文件呢?
我们都知道其实要获取resources资源目录下的文件,有非常多的方法;这些方法虽然能在正常的debug本地运行项目时有效,但在项目打成jar包运行时,却并非都是有效的了!!!
因此,在这里我打算记录一个亲测可行的方法。
首先,展示一下我的项目结构,如图我在resources资源目录下创建了一个文件夹rules,然后在其中创建了3个drl文件:

由于代码逻辑非常简单,所以这里直接通过启动类来测试了。
 www.devze.com; ResourceDemoApplication:
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import java.io.File;
import java.io.IOException;
/**
* resource资源目录专题
* @author Stephen
*/
@SpringBootApplication
public class ResourceDemoApplication {
public static void main(String[] args) {
// SpringApplication.run(ResourceDemoApplication.class, args);
try {
//如何获取resource下的文件?【注意:即使打成jar包也得有效】
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resopythonurces = resourcePatternResolver.getResources("classpath*:rules/**/*.*");
for ( Resource resource : resources ) {
//获取文件名
System.out.println(resource.getFilename());
//获取文件,该方式在打成jar包后会报错,因为resource文件不在系统中,而是在jar包中
File file1 = resource.getFile();
//获取文件,在打成jar包后,通过url来获取文件,则路径是正确的
File file = new File(resource.getURL().getFile());
//获取文件绝对路径,但路径有问题,因为resource文件不在系统中,而是php在jar包中
// System.out.println(file.getAbsolutePath());
//获取文件名
System.out.println(file.getName());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
接下来展示的是运行结果。
首先是本地项目:

可以看到,非常顺利的打印出了文件名。
然后是jar包运行:

同样没问题。
注意:
需要注意的是:在 ResourceDemoApplication 启动类中,有两行被注释掉的代码:

上面这行代码在本地运行是没问题的,但打成jar包运行时会出现如下报错,所以不建议使用:

显示的文件路径是:
jar:file:/C:/Users/Administrator/Desktop/resource_demo-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/rules/comparison-rules.drl
可以看到 resource_demo-0.0.1-SNAPSHOT.jar 后面跟了一个 ! 然后才是对应drl文件target包中的路径,这个细节我没有深究,但单从这个暴多的文件路径来分析的话,我的理解就是,这个文件路径其实是个伪路径,它不是文件真实的url地址,所以通过resource对象无法获取到文件。
另一行注释的代码是:

执行这行代码,即使在jar包运行时,也不会报错,只是在jar包运行时,打印的文件绝对路径并不是真实的路径,也就是系python统无法识别,因为这个文件在jar包内部,路径如下:

如有扩展,后续将会补充。
解决方法:
try {
ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
Resource[] resources = resourcePatternResolver.getResources("classpath*:rules/**/*.*");
for ( Resource resource : resources ) {
//获取文件,在打成jar包后,通过url来获取文件,则路径是正确的
File file = new File(resource.getURL().getFile());
}
} catch (IOException e) {
e.printStackTrace();
}
到此这篇关于Springboot获取jar包中resources资源目录下的文件的文章就介绍到这了,更多相关Springboot获取resources文件内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
加载中,请稍侯......
精彩评论