最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java開發(fā)讀取嵌套jar包中的文件

 更新時間:2023年06月02日 09:11:00   作者:Mzoro  
這篇文章主要為大家介紹了java開發(fā)讀取嵌套jar包中的文件方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

讀取 jar 包中的 jar 文件

例如有一個 Jar 包 A.jar, 他的目錄文件如下圖

A.jar
    |--B.jar
    |--Test.class
    |--.....

通過 new JarFile(A.jar) 可以等到 A.jar 對應(yīng)的對象,可以遍例 A.jar 中的所有文件,Jar 包中的文件以 JarEntry 的形式保存數(shù)據(jù) ,全碼大致如下:

     public void testJar() throws IOException {
        JarFile jarFile = new JarFile("C:\\Users\\Mzoro\\Desktop\\operation-1.1.jar");
        System.out.println(jarFile.getName());
        Enumeration<JarEntry> entries = jarFile.entries();
        while (entries.hasMoreElements()) {
            JarEntry entry = entries.nextElement();
            String name = entry.getName();
            System.out.println(entry.getAttributes());
            System.out.println(name);
        }
     }

但是 如果想繼續(xù)遍歷 B.jar 中的文件就不行了,需要其他方法,有一個活生生的例子是 spring-boot 打包后的 jar 的運行過程

對應(yīng)的 java 類的大致說明

一、嵌套 jar 的數(shù)據(jù)與信息獲取方面

Archive,對 jar 包,或者目錄的抽象

對 jar 包的抽象就是常見的,將 spring-boot 工程發(fā)布成可執(zhí)行 jar 包,和嵌套其中的 jar 包與或目錄,具體實現(xiàn)是 org.springframework.boot.loader.archive.JarFileArchive;可以通過 JarFileArchive 實例獲取它的子目錄或者嵌套的 jar

org.springframework.boot.loader.Launcher, 真正的 springboot 啟動類

這是一個抽象類,作用如下

創(chuàng)建具體的 Archive 實例( Archive createArchive()),JarFileArchive 還是 WarFileArchive, 具體是通過 class 文件的協(xié)議名來判定具體實例了。如果 jar 包啟動,class 文件 url 前面的協(xié)議是以 jar:file 開頭的;如果是 war 包,因為窗口會將 war 解壓之后 再啟動,所以 class 文件 url 的協(xié)議是 file://

創(chuàng)建上下文的 ClassLoader; 用于加載嵌套包中的 class 與 classes 文件夾中的 class。為什么要設(shè)置上下文 classLoader 呢?因為啟動 springboot 的 jar 包時的 classpath 只有 jre 環(huán)境與 springboot 的 jar 包,如果用啟動 Launcher 的 ClassLoader 會找不到類,所以要設(shè)置上下文 ClassLoader 為 LanuchedURLClassLoader

這個類聲明了一個 abstract List<Archive> getClassPathArchives() 方法,抽象的,目的是返回 ClassPath 下的 jar 包或者目錄,為什么設(shè)置為 abstract 呢?因為 war 與 jar 的運行時依賴的 lib 是在不同目錄下的,class 也在不同目錄下,同時還需要過濾掉一些不必要的 jar 包或者 war 包中的東西,比如 MANIFEST.MF 文件對加載類是沒有用的,所有 Archive 集合中沒有必要包含它。這個方法的返回值會在構(gòu)造 LancherURLClassLoader 時傳入,在 findClass 時 會在這些 Archive 代表的目錄或者文件中查找 Class 文件

org.springframework.boot.loader.jar.JarFile

這個類繼承自 java.util.jar.JarFile, 主要重寫的方法 Enumeration<java.util.jar.JarEntry> entries(); 它對應(yīng)的是 springboot jar 中嵌套的 jar , 這個類的主要作用是在構(gòu)造時創(chuàng)建一個 JarFileEntries,這個類主要重寫了 entries () 方法,而這個方法返回的 Enumeration 是依靠 JarFile 持有的 JarFileEnties 獲得的

private JarFile(RandomAccessDataFile rootFile, String pathFromRoot,
			RandomAccessData data, JarEntryFilter filter, JarFileType type)
			throws IOException {
		super(rootFile.getFile());
		this.rootFile = rootFile;
		this.pathFromRoot = pathFromRoot;
		CentralDirectoryParser parser = new CentralDirectoryParser();
		this.entries = parser.addVisitor(new JarFileEntries(this, filter));
		parser.addVisitor(centralDirectoryVisitor());
		this.data = parser.parse(data, filter == null);
		this.type = type;
	}

org.springframework.boot.loader.jar.JarFileEntries

這個類的作用非常重要,它代表一個 jar 包中的所有 Entries, 并且這個類在構(gòu)建時就保存了這個 jar 包中所有 Entry 的文件流信息,所有在通過這個類的對象獲取具體的 JarEnty 對象時,JarEnty 對象就可以包含 entry 對應(yīng)的文件的真正的流數(shù)據(jù)。在 definedClass 方法的入?yún)?,byte [] 是一個必須的參數(shù)

個人覺得難就難在這里,如何計算 jar 包中每個文件的流的偏移量,文件大小等這些信息

壓縮包文件格式

二、ClassLoader 方面

  • LaunchedURLClassLoader

    它繼承自 URLClassLoader,這個類相對 LaunchedURLClassLoader 沒有太大區(qū)別,主要的區(qū)別在于對包的定義,因為在定義包時要從嵌套 jar 中獲取 MANIFEST.MF 信息

  • org.springframework.boot.loader.jar.Handler

    因為 URLClassLoader 在獲取 Class 文件時需要通過 URL 對象來獲取,而這個 url 具體如何獲?。ɑ蛘哒f打開 Connection),可以指定 Handler,org.springframework.boot.loader.jar.Handler 就是為了打開嵌套 jar 連接延生的; 它是實現(xiàn)了 java.net.URLStreamHandler 的類,URLStreamHandelr 只有一個抽象方法,就是 URLConnection openConnection(URL url)

  • JarURLConnection

    可以通過這個類獲取 InputStream 了,有了 InputStream 就可以等到 definedClass 所需的 byte [] 參數(shù),而這個 JarURLConnection 獲取 InputStream 的方法是通過構(gòu)建 JarURLConnection 時的 JarFile 來獲取的,JarFile 獲取 InputStream 的方法是通過其持有的 JarFileEntries 來獲取的,JarFileEntries 的獲取方法就是讀取 jar 包的偏移量讀取二進制數(shù)據(jù)

總結(jié)

看了一通代碼最后感覺還是不能自己實現(xiàn),難點在于讀取嵌套 jar 包流的問題上在

疑問

代碼上感覺 spring-boot-loader 只處理了一層嵌套,不知道能不能處理多層的,當(dāng)然,可能也沒有人這么用;如果可以的話,那么除了 springboot 工程,其他工程有沒有可能也使用這種方式進行打包并進行任意層的嵌套呢?感覺好蠢的想法

參考

springboot 加載 class 方法

壓縮包文件格式

以上就是java開發(fā)讀取嵌套jar包中的文件的詳細內(nèi)容,更多關(guān)于java讀取嵌套jar包文件的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用logback配置按天和文件大小切割輸出日志

    使用logback配置按天和文件大小切割輸出日志

    這篇文章主要介紹了使用logback配置按天和文件大小切割輸出日志方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Java使用Optional實現(xiàn)優(yōu)雅避免空指針異常

    Java使用Optional實現(xiàn)優(yōu)雅避免空指針異常

    空指針異常(NullPointerException)可以說是Java程序員最容易遇到的問題了。為了解決這個問題,Java?8?版本中推出了?Optional?類,本文就來講講如何使用Optional實現(xiàn)優(yōu)雅避免空指針異常吧
    2023-03-03
  • Java 設(shè)計模式之適配器模式詳解

    Java 設(shè)計模式之適配器模式詳解

    設(shè)計模式(Design pattern)是一套被反復(fù)使用、多數(shù)人知曉的、經(jīng)過分類編目的、代碼設(shè)計經(jīng)驗的總結(jié)。使用設(shè)計模式是為了可重用代碼、讓代碼更容易被他人理解、保證代碼可靠性
    2021-11-11
  • java?9大性能優(yōu)化經(jīng)驗總結(jié)

    java?9大性能優(yōu)化經(jīng)驗總結(jié)

    這篇文章主要介紹了java?9大性能優(yōu)化經(jīng)驗總結(jié),包括:Java代碼優(yōu)化,數(shù)據(jù)庫優(yōu)化,分布式緩存,異步化,Web前段,搜索引擎優(yōu)化等需要的朋友可以參考下
    2023-02-02
  • Docker 解決openjdk容器里無法使用JDK的jmap等命令問題

    Docker 解決openjdk容器里無法使用JDK的jmap等命令問題

    這篇文章主要介紹了Docker 解決openjdk容器里無法使用JDK的jmap等命令問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • 利用logback 設(shè)置不同包下的日志級別

    利用logback 設(shè)置不同包下的日志級別

    這篇文章主要介紹了利用logback 設(shè)置不同包下的日志級別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • Java數(shù)據(jù)結(jié)構(gòu)之二叉樹遍歷算法與底層實現(xiàn)方法剖析

    Java數(shù)據(jù)結(jié)構(gòu)之二叉樹遍歷算法與底層實現(xiàn)方法剖析

    只有通過大量的練習(xí),才能逐漸熟悉常見的數(shù)據(jù)結(jié)構(gòu)和算法技巧,從而更快地解決問題,這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之二叉樹遍歷算法與底層實現(xiàn)方法的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2026-06-06
  • 通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取

    通過Java實現(xiàn)中文分詞與文本關(guān)鍵詞提取

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)中文分詞以及文本關(guān)鍵詞提取功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)學(xué)習(xí)
    2023-06-06
  • 關(guān)于Minio配置文件的使用說明

    關(guān)于Minio配置文件的使用說明

    這篇文章主要介紹了關(guān)于Minio配置文件的使用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • springboot實現(xiàn)分段上傳功能的示例代碼

    springboot實現(xiàn)分段上傳功能的示例代碼

    這篇文章主要介紹了springboot實現(xiàn)分段上傳,包括文件上傳下載,斷點續(xù)傳,增量上傳功能,本文通過示例代碼給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07

最新評論

仪征市| 东莞市| 高要市| 海阳市| 深圳市| 左贡县| 临汾市| 蓬安县| 杂多县| 晴隆县| 梅河口市| 习水县| 株洲县| 天全县| 揭东县| 凉城县| 宿州市| 兰坪| 贡觉县| 泾阳县| 华亭县| 江川县| 淮北市| 天台县| 汉源县| 紫阳县| 南京市| 河南省| 普陀区| 普兰县| 泾川县| 翁牛特旗| 常宁市| 桑日县| 万宁市| 顺义区| 法库县| 清新县| 共和县| 贵德县| 石阡县|