千家信息网

springboot如何加载jar包内配置文件

发表于:2024-11-27 作者:千家信息网编辑
千家信息网最后更新 2024年11月27日,本篇内容主要讲解"springboot如何加载jar包内配置文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"springboot如何加载jar包内配置文
千家信息网最后更新 2024年11月27日springboot如何加载jar包内配置文件

本篇内容主要讲解"springboot如何加载jar包内配置文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"springboot如何加载jar包内配置文件"吧!

1、springboot启动 如何加载jar包内注解类?

springboot的 Application类会自动扫描加载其package 及其子package的类,但是其他package 或 jar中的类不会自动被扫描到, 这时需要配置 扫描路径:

@ComponentScan(basePackages = {"com.ysma.oschina", "com.ysma.csdn"},//指定package                excludeFilters = {@ComponentScan.Filter(value = Other.class,                           type= FilterType.ASSIGNABLE_TYPE)})//排除csdn jar包中个别类public class OschinaApplication {        public static void main(String[] args) {                SpringApplication.run(Oschina.class, args);        }}
  • @ComponentScan注释类型的参数含义

basePackages:参数是用于扫描带注释组件的基本包

basePackageClasses:对basepackages()指定扫描注释组件包类型安全的替代

excludeFilters:指定不适合组件扫描的类型

includeFilters:指定哪些类型有资格用于组件扫描

lazyInit:指定是否应注册扫描的beans为lazy初始化

useDefaultFilters:指示是否自动检测类的注释

  • @Filter中FilterType包含的类型及意义

ANNOTATION:注解类型

ASSIGNABLE_TYPE:ANNOTATION:指定的类型

ASPECTJ:按照Aspectj的表达式,基本上不会用到

REGEX:按照正则表达式

CUSTOM:自定义规则 需实现自定义FilterType 如下:

 public class MyFilterType implements TypeFilter {     @Override    public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory) throws IOException {         if (metadataReader.getClassMetadata().getClassName().contains("Department")){            //获取当前类注解的信息            AnnotationMetadata annotationMetadata = metadataReader.getAnnotationMetadata();            for (String s : annotationMetadata.getAnnotationTypes()) {                System.out.println("当前正在被扫描的类注解类型" + s);            }            //获取当前正在扫描类的信息            ClassMetadata classMetadata = metadataReader.getClassMetadata();            System.out.println("当前正在被扫描的类的类名" + classMetadata.getClassName());            //获取当前类的资源信息(类存放的路径...)            Resource resource = metadataReader.getResource();            System.out.println("当前正在被扫描的类存放的地址" + resource.getURL());            return true;        }        return false;    }}

2、jar包内加载资源

  • 路径问题 overview.properties放在resource根目录的config文件夹下

resource工程路径不行,会自动指定到jar包所在工程资源路径,如 /config/overview.properties

resource 类路径不行,会自动指定到jar包所在工程类路径,如 config/overview.properties

classpath路径可行,会自动识别并加载类路径,如classpath:config/overview.properties 此时配置文件放在父工程的classpath目录下

ResourceUtil实例如下

import lombok.extern.slf4j.Slf4j;import org.apache.commons.io.IOUtils;import org.springframework.core.io.ClassPathResource;import org.springframework.util.ResourceUtils;import java.io.*;import java.net.URL;/** * 资源加载工具 * 本应用为jar包应用,主要使用classpath路径 * @see this getClassPathFile */@Slf4jpublic class ResourceUtil {    private static final String PATH_WINDOWS = "\\\\";    private static final String PATH_LINUX = "/";    /**     * 读取jar包文件     * @param pathName 路径     * @return inputStream     * @throws FileNotFoundException     */    public static URL getJarURL(String pathName) throws FileNotFoundException {        try {            ClassPathResource classPathResource = new ClassPathResource(pathName);            return classPathResource.getURL();        } catch (IOException e) {            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", pathName);            throw new FileNotFoundException(pathName + "文件不存在");        }    }    /**     * jar包内文件的获取     * @param classPath 因为性对路径问题,通过classpath获取比较好     * @return 文件 classpath:config/overview.properties     * @throws FileNotFoundException ex     */    @Deprecated    public static File getClassPathFile(String classPath) throws FileNotFoundException {        try {            return ResourceUtils.getFile(classPath);        } catch (FileNotFoundException e) {            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", classPath);            throw new FileNotFoundException(classPath + "文件不存在");        }    }    /**     * 获取文件路径     * @param path 文件路径     * @return URL     */    public static URL getResourcePath(String path) throws FileNotFoundException {        try {            //1.以Linux路径为准            path = path.replaceAll(PATH_WINDOWS, PATH_LINUX);            /*              2.依据开头自主选择加载方法              第一:前面有 "/" 代表了工程的根目录,例如工程名叫做myproject,"/"代表了myproject              第二:前面没有 "" 代表当前类的目录             */            return path.startsWith(PATH_LINUX) ?                    ResourceUtil.class.getResource(path) :                    ResourceUtil.class.getClassLoader().getResource(path);        } catch (Exception e) {            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", path);            throw new FileNotFoundException(path + "文件不存在");        }    }    /**     * 获取文件     * @see #getJarURL(String path)     */    public static File getJarFile(String path) throws FileNotFoundException {        try {            ClassPathResource classPathResource = new ClassPathResource(path);            InputStream is = classPathResource.getInputStream();            File tempFile = File.createTempFile("groovy", null);            IOUtils.copy(is, new FileOutputStream(tempFile));            return tempFile;        } catch (IOException e) {            log.error("ResourceUtil.getResourcePath 文件不存在, path:{}", path);            throw new FileNotFoundException(path + "文件不存在");        }    }}

3、classpath路径问题 如上2中如果配置文件放置在jar包中,则class地址应为:classpath*:config/overview.properties

classpath和classpath*区别:

A:classpath:只会到你的class路径中查找找文件。

B:classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找。

C:在多个classpath中存在同名资源,都需要加载时,那么用classpath:只会加载第一个,这种情况下也需要用classpath*:前缀。

注意: 用classpath*:需要遍历所有的classpath,所以加载速度是很慢的;因此,在规划的时候,应该尽可能规划好资源文件所在的路径,尽量避免使用classpath*。

到此,相信大家对"springboot如何加载jar包内配置文件"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文件 路径 类型 配置 工程 资源 正在 注解 注释 组件 代表 信息 所在 问题 不行 内容 参数 地址 方法 根目录 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络数据库与开发技术 北京中关村网络安全测评联盟 软件开发项目需要结算审计吗 产品部软件开发 win7怎么进入带网络安全模式 网络安全的要素是什么 幻塔星岛5服务器 无法删除数据库记录 网络安全测绘空间 数据库表变动触发方法 学习网络技术去哪家好 网络安全规则简单 高校软件开发模式是什么课程 电脑带网络安全模式能玩游戏吗 西安交大电信部网络安全硕士就业 如何查询期刊数据库正规吗 江阴ibm服务器维修网点 复旦微电子集团软件开发笔试 放心的纸箱吸塑一体软件开发企业 宁夏卫生健康委员会数据库 产品部软件开发 黄岛区app软件开发哪家做的好 南京现代软件开发产品介绍 软件开发分层的意义 华为云服务器有几种服务类型 自己能登录疫情数据库吗 抓好网络安全管控专题讨论 网络安全科室 便宜g口服务器 数据库技术目前发展状况
0