您好,登錄后才能下訂單哦!
本篇內容主要講解“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 */ @Slf4j public 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包內配置文件”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。