千家信息网

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

发表于:2024-10-21 作者:千家信息网编辑
千家信息网最后更新 2024年10月21日,本篇内容主要讲解"springboot如何加载jar包内配置文件",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"springboot如何加载jar包内配置文
千家信息网最后更新 2024年10月21日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包内配置文件"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

0