在Spring Boot中从类路径加载文件
介绍
创建Spring Boot Web应用程序时,有时有时需要从类路径中加载文件;war和jar的加载文件格式是不一样的
在下面,您将找到在WAR和JAR中加载文件的解决方案。
资源加载器
使用Java,您可以使用当前线程的classLoader并尝试加载文件,但是Spring Framework为您提供了更为优雅的解决方案,例如ResourceLoader。
您只需要自动连接ResourceLoader
,然后调用getResource(„somePath“)
方法即可。
在Spring Boot(WAR)中从资源目录/类路径加载文件的示例
在以下示例中,我们从类路径中加载名为GeoLite2-Country.mmdb的文件作为资源,然后将其作为File
对象检索。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Autowired
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- }
- @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- File dbAsFile = resource.getFile();
- // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsFile)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }
在Spring Boot(JAR)中从资源目录/类路径加载文件的示例
如果您想从Spring Boot JAR中的 classpath加载文件,则必须使用该resource.getInputStream()
方法将其作为InputStream检索。如果尝试使用resource.getFile()
该方法,则会收到错误消息,因为Spring尝试访问文件系统路径,但无法访问JAR中的路径。
- @Service("geolocationservice")
- public class GeoLocationServiceImpl implements GeoLocationService {
- private static final Logger LOGGER = LoggerFactory.getLogger(GeoLocationServiceImpl.class);
- private static DatabaseReader reader = null;
- private ResourceLoader resourceLoader;
- @Inject
- public GeoLocationServiceImpl(ResourceLoader resourceLoader) {
- this.resourceLoader = resourceLoader;
- }
- @PostConstruct
- public void init() {
- try {
- LOGGER.info("GeoLocationServiceImpl: Trying to load GeoLite2-Country database...");
- Resource resource = resourceLoader.getResource("classpath:GeoLite2-Country.mmdb");
- InputStream dbAsStream = resource.getInputStream(); // <-- this is the difference
- // Initialize the reader
- reader = new DatabaseReader
- .Builder(dbAsStream)
- .fileMode(Reader.FileMode.MEMORY)
- .build();
- LOGGER.info("GeoLocationServiceImpl: Database was loaded successfully.");
- } catch (IOException | NullPointerException e) {
- LOGGER.error("Database reader cound not be initialized. ", e);
- }
- }
- @PreDestroy
- public void preDestroy() {
- if (reader != null) {
- try {
- reader.close();
- } catch (IOException e) {
- LOGGER.error("Failed to close the reader.");
- }
- }
- }
- }
在Spring Boot中从类路径加载文件的更多相关文章
- Spring Boot 2.4 配置文件将加载机制大变化
Spring Boot 2.4.0.M2 刚刚发布,它对 application.properties 和 application.yml 文件的加载方式进行重构.如果应用程序仅使用单个 applic ...
- Spring Boot中普通类获取Spring容器中的Bean
我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,自己动手n ...
- 精尽Spring Boot源码分析 - 配置加载
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- JVM中java类的加载时机(转载:http://blog.csdn.net/chenleixing/article/details/47099725)
Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的加载机制.类从被加载到虚拟机内存中开始,到卸载出内 ...
- Spring Boot 启动以后然后再加载缓存数据 CommandLineRunner
实际应用中,我们会有在项目服务启动完成以后去加载一些数据或做一些事情(比如缓存)这样的需求. 为了解决这样的问题,Spring Boot 为我们提供了一个方法,通过实现接口 CommandLineRu ...
- Spring Boot源码分析-配置文件加载原理
在Spring Boot源码分析-启动过程中我们进行了启动源码的分析,大致了解了整个Spring Boot的启动过程,具体细节这里不再赘述,感兴趣的同学可以自行阅读.今天让我们继续阅读源码,了解配置文 ...
- 解决spring boot中普通类中使用service为null 的方法
我使用的是springboot+mybatisplus +mysql1.创建一个SpringUtil工具类 import org.springframework.beans.BeansExceptio ...
- Spring Boot中application.properties和application.yml文件
application.properties和application.yml文件可以放在一下四个位置: 外置,在相对于应用程序运行目录的/congfig子目录里. 外置,在应用程序运行的目录里 内置, ...
- (转)spring boot实战(第六篇)加载application资源文件源码分析
原文:http://blog.csdn.net/liaokailin/article/details/48878447
随机推荐
- 想看Vue文档,cn放错位置,误入xx网站...
昨晚,DD在微信群(点击加入)里看到有小伙伴说,想去Vue官网看中文文档,不当心把cn写错了位置,结果进入了xx网站... 老司机们应该都知道,Vue官网的中文文档地址是:https://cn.vue ...
- Linux设置主机名与hosts映射
目的 方便操作,便于建立Linux集群. 设置主机名 查看主机名:hostname 设置主机名,修改/etc/hosts:vim /etc/hostname 通过主机名ping通 原理 通过hosts ...
- <数据结构>XDOJ323.判断有向图中是否有环
问题与解答 问题描述 判断有向图中是否有环. 输入格式 输入数据第一行是一个正整数,表示n个有向图,其余数据分成n组,每组第一个为一个整数,表示图中的顶点个数n,顶点数不超过100,之后为有向图的邻接 ...
- 【优雅代码】01-lombok精选注解及原理
[优雅代码]01-lombok精选注解及原理 欢迎关注b站账号/公众号[六边形战士夏宁],一个要把各项指标拉满的男人.该文章已在github目录收录. 屏幕前的大帅比和大漂亮如果有帮助到你的话请顺手点 ...
- Python的面向对象常见概念解析
[常见概念简介] 类(class)-- 用来描述某些具有相同属性和方法的对象的集合.格式如下 class test(): class_variable ... def f(self,*arg,**ar ...
- InnoDB学习(七)之索引结构
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.可以将数据库索引和书的目录进行类比,通过书的目录我们可以快速查找到章节位置,如果没有目录就只能一页页翻书查找 ...
- centos7 安装locate
使用locate my.cnf命令可以列出所有的my.cnf文件 yum -y install mlocate 原因是安装完后没有更新库 更新库:updatedb
- centos7安装wordpress详细教程
安装之前:建议安装各种软件 [root@localhost ~]# yum -y install wget zip unzip net-tools 一.安装apache 测试环境建议关闭防火墙和SEL ...
- jquery 的 ajax 传输 数组 ,但后台无法获取的 原因 与 解决 办法
1.前言 js传输数组到服务器 ,controller无法解析 ,打印结果是 null 2.原因 jQuery会调用jQuery.param序列化参数,源码是 jQuery.param( obj, t ...
- 为 MySQL 的 root 用户设置一个密码。
shell> mysqladmin --user=root password somepasswordshell> mysqladmin --user=root --password re ...