获取FatJar资源URL

背景知识:Archive

  Archive表示归档文件,通常为tar/zip等格式压缩包,Jar包为zip格式归档文件。SpringBoot抽象了Archive的概念,分为JarFileArchive(Jar包)和ExplodedArchive(文件目录)。
这里写图片描述

获取嵌套资源过程

  1. 获取当前Jar包代表的Archive;
  2. 根据过滤条件筛选出当前Jar包嵌套的资源;

获取当前Jar包代表的Archive

  首先获取当前Jar包所在的路径,然后创建JarFileArchive,如下所示:

protected final Archive createArchive() throws Exception {
        ProtectionDomain protectionDomain = getClass().getProtectionDomain();
        CodeSource codeSource = protectionDomain.getCodeSource();
        URI location = (codeSource == null ? null : codeSource.getLocation().toURI());
        String path = (location == null ? null : location.getSchemeSpecificPart());
        if (path == null) {
            throw new IllegalStateException("Unable to determine code source archive");
        }
        File root = new File(path);
        if (!root.exists()) {
            throw new IllegalStateException(
                    "Unable to determine code source archive from " + root);
        }
        return (root.isDirectory() ? new ExplodedArchive(root)
                : new JarFileArchive(root));
    }

获取Jar包嵌套资源

这里写图片描述

将符合条件的嵌套Jar包过滤出来,如下所示:

protected Archive getNestedArchive(Entry entry) throws IOException {
        JarEntry jarEntry = ((JarFileEntry) entry).getJarEntry();
        if (jarEntry.getComment().startsWith(UNPACK_MARKER)) {
            return getUnpackedNestedArchive(jarEntry);
        }
        try {
            JarFile jarFile = this.jarFile.getNestedJarFile(jarEntry);
            return new JarFileArchive(jarFile);
        }
        catch (Exception ex) {
            throw new IllegalStateException(
                    "Failed to get nested archive for entry " + entry.getName(), ex);
        }
    }

参考:

  1. https://segmentfault.com/a/1190000013532009

猜你喜欢

转载自blog.csdn.net/yangguosb/article/details/80772921
今日推荐