日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

读取jar包内部配置文件信息的解析

發布時間:2025/3/20 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 读取jar包内部配置文件信息的解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

讀取jar文件內部的配置信息是在進行開發基于java程序組件時必然會遇到的問題,這里所遇到的問題是在開發測試和部署(也就是將程序打成jar包之后供其他組件調用)時往往會不一致。也就是開發的時候我們的代碼可以訪問到配置文件信息,但是一旦打成jar包之后往往會遇到“FileNotFoundException”,也就是無法找到配置文件。下面看一個示例。
?

?
這是一個測試項目,項目的結構如圖所示,現在需要在Main.java類中讀取conf.properties文件中的信息。


不一致行為
如果我們在代碼中使用下面的語句
?

  • ... ?
  • String?confPath?=?"src/conf/conf.properties"; ?
  • FileInputStream?fis?=?new?FileInputStream(new?File(confPath)); ?
  • config.load(fis); ?
  • ...?
  • 那么我們打成jar包之前運行程序是可以讀取到所要信息,但是打成jar包之后必然會遇到“FileNotFoundException”。而如果使用下面的代碼
    ?

  • ...?? ?
  • String?confPath?=?"conf/conf.properties";??
  • FileInputStream?fis?=?new?FileInputStream(new?File(confPath));??
  • config.load(fis);?? ?
  • ...??
  • 那么無論是打包之前還是之后都會遇到“FileNotFoundException”的異常!

    正確的做法

  • ... ?
  • String?confPath?=?"conf/conf.properties"; ?
  • config.load(this.getClass().getClassLoader().getResourceAsStream(confPath)); ?
  • ...?
  • 這時,無論是在打jar包之前還是之后都可以正確讀取conf.properties文件中的信息!

    原因分析
    上面兩種截然不同的結果產生的原因是我們使用的FileInputStream和getResourceAsStream()方法的差異所造成的!所以原因也必然在于FileInputStream和getResourceAsStream()的不同。
    根據JDK中的表述,FileInputStream是基于當前JVM所在的OS,在文件系統指定的路徑中進行查找要求的資源。而ClassLoader類的getResourceAsStream()方面的描述如下:

    ? public InputStream getResourceAsStream(String name)
    返回讀取指定資源的輸入流。

    getResource(String) 的文檔中描述了搜索順序。

    參數:
    name - 資源名稱
    返回:
    用于讀取資源的輸入流,如果無法找到資源,則返回 null
    從以下版本開始:
    1.1
    public URL getResource(String name)
    查找具有給定名稱的資源。資源是可以通過類代碼以與代碼基無關的方式訪問的一些數據(圖像、聲音、文本等)。

    資源名稱是以 '/' 分隔的標識資源的路徑名稱。

    此方法首先搜索資源的父類加載器;如果父類加載器為 null,則搜索的路徑就是虛擬機的內置類加載器的路徑。如果搜索失敗,則此方法將調用 findResource(String) 來查找資源。

    ?

    參數:
    name - 資源名稱
    返回:
    讀取資源的 URL 對象;如果找不到該資源,或者調用者沒有足夠的權限獲取該資源,則返回 null
    從以下版本開始:
    1.1

    ?
    從這段文字表述中我們不難發現,getResourceAsStream()在查找資源時跟JVM所用的OS毫無關系,甚至跟資源所在文件系統的路徑也是無關的,它是基于類路徑進行查找的!也就是說,當jar包或*.class文件加載之后,JVM會根據jar包或*.class文件所在的classpath屬性去查找指定的資源,而這個classpath是在jar包的MANIFEST.MF文件中指定的,如下所示:
    Manifest-Version: 1.0
    Class-Path: .
    Main-Class: com.webex.app.Main
    這里的“.”代表當前路徑,是一個相對路徑,但是它相對的是一個“虛擬路徑”,也就是jar或*.class文件加載到JVM后的“路徑”!

    ?

    轉載于:https://blog.51cto.com/zorro/869765

    總結

    以上是生活随笔為你收集整理的读取jar包内部配置文件信息的解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。