熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

程序內部剖析——JAR 文件揭密

2022-06-13   來源: JSP教程 

  大多數 Java 程序員都熟悉對 JAR 文件的基本操作但是只有少數程序員了解 JAR 文件格式的強大功能在本文中作者探討了 JAR 格式的許多功能和優勢包括打包可執行的 JAR 文件安全性和索引
  
  JAR 文件是什麼?
  
  JAR 文件格式以流行的 ZIP 文件格式為基礎用於將許多個文件聚集為一個文件與 ZIP 文件不同的是JAR 文件不僅用於壓縮和發布而且還用於部署和封裝庫組件和插件程序並可被像編譯器和 JVM 這樣的工具直接使用在 JAR 中包含特殊的文件如 manifests 和部署描述符用來指示工具如何處理特定的 JAR
  
  一個 JAR 文件可以用於
  
  用於發布和使用類庫
  
  作為應用程序和擴展的構建單元
  
  作為組件applet 或者插件程序的部署單位
  
  用於打包與組件相關聯的輔助資源
  
  JAR 文件格式提供了許多優勢和功能其中很多是傳統的壓縮格式如 ZIP 或者 TAR 所沒有提供的它們包括
  
  安全性 可以對 JAR 文件內容加上數字化簽名這樣能夠識別簽名的工具就可以有選擇地為您授予軟件安全特權這是其他文件做不到的它還可以檢測代碼是否被篡改過
  
  減少下載時間 如果一個 applet 捆綁到一個 JAR 文件中那麼浏覽器就可以在一個 HTTP 事務中下載這個 applet 的類文件和相關的資源而不是對每一個文件打開一個新連接
  
  壓縮JAR 格式允許您壓縮文件以提高存儲效率
  
  傳輸平台擴展 Java 擴展框架(Java Extensions Framework)提供了向 Java 核心平台添加功能的方法這些擴展是用 JAR 文件打包的(Java D 和 JavaMail 就是由 Sun 開發的擴展例子)
  
  包密封 存儲在 JAR 文件中的包可以選擇進行密封以增強版本一致性和安全性密封一個包意味著包中的所有類都必須在同一 JAR 文件中找到
  
  包版本控制 一個 JAR 文件可以包含有關它所包含的文件的數據如廠商和版本信息
  
  可移植性 處理 JAR 文件的機制是 Java 平台核心 API 的標准部分
  
  壓縮的和未壓縮的 JAR
  
  jar 工具(有關細節參閱 jar 工具)在默認情況下壓縮文件未壓縮的 JAR 文件一般可以比壓縮過的 JAR 文件更快地裝載因為在裝載過程中要解壓縮文件但是未壓縮的文件在網絡上的下載時間可能更長
  
  METAINF 目錄
  
  大多數 JAR 文件包含一個 METAINF 目錄它用於存儲包和擴展的配置數據如安全性和版本信息Java 平台識別並解釋 METAINF 目錄中的下述文件和目錄以便配置應用程序擴展和類裝載器
  
  MANIFESTMF 這個 manifest 文件定義了與擴展和包相關的數據
  
  INDEXLIST 這個文件由 jar 工具的新選項 i 生成它包含在應用程序或者擴展中定義的包的位置信息它是 JarIndex 實現的一部分並由類裝載器用於加速類裝載過程
  
  xxxSF 這是 JAR 文件的簽名文件占位符 xxx 標識了簽名者
  
  xxxDSA 與簽名文件相關聯的簽名程序塊文件它存儲了用於簽名 JAR 文件的公共簽名
  
  jar 工具
  
  為了用 JAR 文件執行基本的任務要使用作為Java Development Kit 的一部分提供的 Java Archive Tool (jar 工具)用 jar 命令調用 jar 工具 顯示了一些常見的應用
  
  表 常見的 jar 工具用法 功能 命令
  
  用一個單獨的文件創建一個 JAR 文件 jar cf jarfile inputfile
  
  用一個目錄創建一個 JAR 文件 jar cf jarfile dirname
  
  創建一個未壓縮的 JAR 文件 jar cf jarfile dirname
  
  更新一個 JAR 文件 jar uf jarfile inputfile
  
  查看一個 JAR 文件的內容 jar tf jarfile
  
  提取一個 JAR 文件的內容 jar xf jarfile
  
  從一個 JAR 文件中提取特定的文件 jar xf jarfile archivedfile
  
  運行一個打包為可執行 JAR 文件的應用程序 java jar appjar
  
  可執行的 JAR
  
  一個可執行的 jar 文件是一個自包含的 Java 應用程序它存儲在特別配置的JAR 文件中可以由 JVM 直接執行它而無需事先提取文件或者設置類路徑要運行存儲在非可執行的 JAR 中的應用程序必須將它加入到您的類路徑中並用名字調用應用程序的主類但是使用可執行的 JAR 文件我們可以不用提取它或者知道主要入口點就可以運行一個應用程序可執行 JAR 有助於方便發布和執行 Java 應用程序
  
  創建可執行 JAR
  
  創建一個可執行 JAR 很容易首先將所有應用程序代碼放到一個目錄中假設應用程序中的主類是 commycompanymyappSample您要創建一個包含應用程序代碼的 JAR 文件並標識出主類為此在某個位置(不是在應用程序目錄中)創建一個名為 manifest 的文件並在其中加入以下一行
  
  MainClass: commycompanymyappSample
  
  然後像這樣創建 JAR 文件
  
  jar cmf manifest ExecutableJarjar applicationdir
  
  所要做的就是這些了 現在可以用 java jar 執行這個 JAR 文件 ExecutableJarjar
  
  一個可執行的 JAR 必須通過 menifest 文件的頭引用它所需要的所有其他從屬 JAR如果使用了 jar 選項那麼環境變量 CLASSPATH 和在命令行中指定的所有類路徑都被 JVM 所忽略
  
  啟動可執行 JAR
  
  既然我們已經將自己的應用程序打包到了一個名為 ExecutableJarjar 的可執行 JAR 中了那麼我們就可以用下面的命令直接從文件啟動這個應用程序
  
  java jar ExecutableJarjar
  
  包密封
  
  密封 JAR 文件中的一個包意味著在這個包中定義的所有類都必須在同一個 JAR 文件中找到這使包的作者可以增強打包類之間的版本一致性密封還提供了防止代碼篡改的手段
  
  要密封包需要在 JAR 的 manifest 文件中為包添加一個 Name 頭然後加上值為true的 Sealed 頭與可執行的 JAR 一樣可以在創建 JAR 時通過指定一個具有適當頭元素的 manifest 文件密封一個 JAR如下所示
  
  Name: com/samplePackage/
  
  Sealed: true
  
  Name 頭標識出包的相對路徑名它以一個/結束以與文件名區別在 Name 頭後面第一個空行之前的所有頭都作用於在 Name 頭中指定的文件或者包在上述例子中因為 Sealed 頭出現在 Name 頭後並且中間沒有空行所以 Sealed 頭將被解釋為只應用到包 com/samplePackage 上
  
  如果試圖從密封包所在的 JAR 文件以外的其他地方裝載密封包中的一個類那麼 JVM 將拋出一個 SecurityException
  
  擴展打包
  
  擴展為 Java 平台增加了功能在 JAR 文件格式中已經加入了擴展機制擴展機制使得 JAR 文件可以通過 manifest 文件中的 ClassPath 頭指定所需要的其他 JAR 文件
  
  假設 extensionjar 和 extensionjar 是同一個目錄中的兩個 JAR 文件extensionjar 的 manifest 文件包含以下頭
  
  ClassPath: extensionjar
  
  這個頭表明 extensionjar 中的類是 extensionjar 中的類的擴展類extensionjar 中的類可以調用 extensionjar 中的類並且不要求 extensionjar 處在類路徑中
  
  在裝載使用擴展機制的 JAR 時JVM 會高效而自動地將在ClassPath 頭中引用的 JAR 添加到類路徑中不過擴展 JAR 路徑被解釋為相對路徑所以一般來說擴展 JAR 必須存儲在引用它的 JAR 所在的同一目錄中
  
  例如假設類 ExtensionClient 引用了類 ExtensionDemo它捆綁在一個名為 ExtensionClientjar 的 JAR 文件中而類 ExtensionDemo 則捆綁在 ExtensionDemojar 中為了使 ExtensionDemojar 可以成為擴展必須將 ExtensionDemojar 列在 ExtensionClientjar 的 manifest 的 ClassPath 頭中如下所示
  
  ManifestVersion:
  
  ClassPath: ExtensionDemojar
  
  在這個 manifest 中 ClassPath 頭的值是沒有指定路徑的 ExtensionDemojar表明 ExtensionDemojar 與 ExtensionClient JAR 文件處在同一目錄中
  
  JAR 文件中的安全性
  
  JAR 文件可以用 jarsigner 工具或者直接通過 javasecurity API 簽名一個簽名的 JAR 文件與原來的 JAR 文件完全相同只是更新了它的 manifest並在 METAINF 目錄中增加了兩個文件一個簽名文件和一個簽名塊文件
  
  JAR 文件是用一個存儲在 Keystore 數據庫中的證書簽名的存儲在 keystore 中的證書有密碼保護必須向 jarsigner 工具提供這個密碼才能對 JAR 文件簽名
  
  圖 Keystore 數據庫
  
  JAR 的每一位簽名者都由在 JAR 文件的 METAINF 目錄中的一個具有 SF 擴展名的簽名文件表示這個文件的格式類似於 manifest 文件 一組 RFC如下所示它的組成包括一個主要部分它包括了由簽名者提供的信息但是不特別針對任何特定的 JAR 文件項還有一系列的單獨的項這些項也必須包含在 menifest 文件中在驗證一個簽名的 JAR 時將簽名文件的摘要值與對 JAR 文件中的相應項計算的摘要值進行比較
  
  清單 簽名 JAR 中的 Manifest 和 signature 文件
  
  Contents of s
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19206.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.