SpringBoot项目读取依赖jar包中的文件

一、SpringBoot项目读取依赖jar中文件

目前 Java 服务端开发最主流的方式是 SpringBoot,整个项目打包为一个可运行 jar 包,解压打开后看到结构如下:
jar内部结构
项目中依赖的其他 jar 包则被打包在 artwork-web-0.0.1-SNAPSHOT.jar\BOOT-INF\lib 目录下,如何在项目运行中读取所依赖 jar 包,甚至是所依赖 jar 包自身内部依赖的 jar 包里的各种指定文件?
在实际工作中常见的场景比如像读取一些依赖SDK这种 jar 包里的秘钥证书keystore文件等。

首先,方法肯定是存在的,不然 SpringBoot 也没必要把这么多依赖 jar 都打包进来,打包进来肯定是为了 Spring 去读取的。
比如在前文《SpringBoot-starter的原理》中提到如何获取各个 autoconfigure 依赖 jar 中的工厂发现文件 META-INF/spring.factories,以完成 SpringBoot starter 的自动配置的。
通常使用ClassLoader加载,如下:

Enumeration<URL> urls = null;
try {
    
    
    //假设读取META-INF/MANIFEST.MF文件
    urls = ArtworkApplication.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
    int i = 1;
    while (urls.hasMoreElements()) {
    
    
        URL url = urls.nextElement();
        log.info("===={}, {}", i++, url.getPath());
    }
} catch (IOException e) {
    
    
    log.error(e.getMessage());
}

ClassLoader.getResources(name)这种方式会获取到所有依赖 jar 以及依赖 jar 自身依赖 jar 中满足条件的文件,若有多个返回则需要再次过滤即可。
同样ClassLoader.getResource(name)这种方式会返回第一个找到的文件。比如读取 shop-dto-0.0.1-SNAPSHOT.jar 中的 pom.xml 文件内容,如下:

URL url = ArtworkApplication.class.getClassLoader().getResource("lib/shop-dto-0.0.1-SNAPSHOT.jar!/pom.xml");
try {
    
    
    log.info("===={}", org.apache.commons.io.IOUtils.toString(url, StandardCharsets.UTF_8));
} catch (IOException e) {
    
    
    log.error(e.getMessage());
}

二、普通Java工程读取依赖jar中文件

假设需要直接读取某个指定绝对路径的 jar 包中的文件。比如读取 E:\myCodes\artwork\shop\shop-dto\target\shop-dto-0.0.1-SNAPSHOT.jar 中的 pom.xml 文件内容,如下:

public static void main(String[] args) throws IOException {
    
    
    JarFile jar = new JarFile("E:\\myCodes\\artwork\\shop\\shop-dto\\target\\shop-dto-0.0.1-SNAPSHOT.jar");
    Enumeration<?> entries = jar.entries();
    while (entries.hasMoreElements()) {
    
    
        JarEntry entry = (JarEntry) entries.nextElement();
        if (entry.getName().toLowerCase().endsWith("pom.xml")) {
    
    
            String str = IOUtils.toString(jar.getInputStream(entry), StandardCharsets.UTF_8);
            System.out.println(str);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/songzehao/article/details/120560678
今日推荐