【java學習】jar、arr和程式打包

兔兔西發表於2018-10-08

1,*.jar(JAR 檔案,Java Archive File,Java 歸檔檔案)

1)概念

是 Java 的一種文件格式。只包含了class檔案與清單檔案 ,不包含資原始檔,是與平臺無關的檔案格式。

解壓:jar檔案使用了ZIP壓縮格式。找一個jar檔案,然後修改字尾名為‘zip’或者‘rar’格式,可解壓該檔案,點選‘com‘資料夾就會看到裡面全部是‘.class’檔案。

ZIP壓縮
壓縮可以分為無失真壓縮和有失真壓縮,有損,指的是壓縮之後就無法完整還原原始資訊,但是壓縮率可以很高,主要應用於視訊、話音等資料的壓縮。無失真壓縮則用於檔案等等必須完整還原資訊的場合。ZIP、RAR、GZIP、GIF、PNG等等都是無失真壓縮格式。

2)優點

JAR 檔案格式提供了許多優勢和功能,其中很多是傳統的壓縮格式如 ZIP 或者 TAR 所沒有提供的:
安全性、減少下載時間、傳輸平臺擴充套件、包密封、包版本控制、可移植性

3)場景

JAR 檔案格式以流行的 ZIP 檔案格式為基礎。
與 ZIP 檔案不同的是,JAR 檔案不僅用於壓縮和釋出,而且還用於部署和封裝庫、元件和外掛程式,並可被編譯器和 JVM 這樣的工具直接使用。

在 JAR 中包含特殊的檔案,如 manifests 和部署描述符,用來指示工具如何處理特定的 JAR。

4)使用

*.jar檔案拷貝到libs目錄,eclipse直接匯入即可,AndroidStudio專案中新增:

dependencies {  
    compile fileTree(include: ['*.jar'], dir: 'libs')  
}  

5)Pack200

Java5中帶了一個壓縮工具:Pack200,這個工具能對普通的jar檔案進行高效壓縮。其實現原理是根據Java類特有的結構,合併常數池,去掉無用資訊等來實現對java類的高效壓縮。由於是專門對Java類進行壓縮的,所以對普通檔案的壓縮和普通壓縮軟體沒有什麼兩樣,但是對於Jar檔案卻能輕易達到10-40%的壓縮率,甚至接近90%。這在Java應用部署中很有用,尤其對於移動Java計算,能夠大大減小程式碼下載量。
Java5中還提供了這一技術的API介面,你可以將其嵌入到你的程式中使用。使用的方法很簡單:
壓縮

Packer packer=Pack200.newPacker();
OutputStream output=new BufferedOutputStream(new FileOutputStream(outfile));
packer.pack(new JarFile(jarFile), output);
output.close();

解壓

Unpacker unpacker=Pack200.newUnpacker();
output=new JarOutputStream(new FileOutputStream(jarFile));
unpacker.unpack(pack200File, output);
output.close();

6)組成

JAR包比普通zip檔案多了一個META-INF資料夾,該資料夾下包括了一個MANFEST.MF檔案(清單檔案)。

①清單檔案

一般屬性

Manifest-Version
用來定義manifest檔案的版本號,比如:Manifest-Version: 1.0。最小的清單檔案只包含這一條。
Created-By
宣告該檔案的生成者,一般該屬性是由jar命令列工具生成的。比如:Created-By: Apache Ant 1.5.1
Signature-Version
定義jar檔案的簽名版本號
Class-Path
應用程式或者類裝載器使用該值來構建內部的類搜尋路徑

應用程式相關屬性

Main-Class
定義jar檔案的入口類。該類必須是一個可執行的類,一旦定義了該屬性就可以通過 java -jar x.jar來執行該jar檔案。

7)啟動

在Windows下安裝JRE的時候,安裝檔案會把.jar檔案對映給javaw.exr開啟,對於一個可執行的JAR包而言,能夠直接雙擊開啟。想要製作可執行JAR包,指定Main-Class是關鍵。

使用cvmf命令進行打包
jar -cvmf MANIFEST.MF allenwells.jar com

可以利用jar命令中的e選項制定程式入口點。使用者可以通過以下命令啟動應用程式:

java -jar My.jar

製作可執行Jar包:

8)常用命令

-c 建立新的JAR檔案包。

-t 列出JAR檔案包的內容列表。
-x 展開JAR檔案包的指定檔案或全部檔案。
-u 更新已存在的JAR包。對於一個已經存在的JAR包。我們任然能夠向當中加入新的位元組碼檔案或舊的位元組碼檔案,假設已經存在路徑、類名都同樣的檔案,則更新原始檔,假設不存在。則加入該檔案。清單檔案也能夠通過這種方式更改。

-v 生成具體的報告並列印到標準輸出。
-f 指定JAR包的檔名稱。通常該選項是必選的。

-m 指定須要包括的MANIFEST.MF清單檔案。

-O 僅僅儲存。不壓縮。

生成的JAR包體積大,但執行速度快。

-M 不產生全部項的清單檔案,此引數會忽略-m選項。
[-C 資料夾] 表示轉到指定資料夾下去執行jar命令的操作,它相當於優先使用cd命令轉到指定資料夾下執行不帶-C引數的jar命令。它僅僅能在建立和更新JAR包的時候使用

以下舉一些具體使用的樣例:

jar tvf allenwells.jar   
顯示allenwells.jar內包括檔案的具體資訊。

jar -xvf allenwells.jar
解壓allenwells.jar到當前資料夾,並顯示具體的解壓過程資訊。

jar cvf allenwells.jar com
將com資料夾下的class檔案生成allenwells.jar檔案,並顯示打包過程,假設已經存在該檔案,那麼該檔案會被覆蓋。

jar cvfm allenwells.jar mymanifest.mf -C com/ . 
使用自己定義的清單檔案mymanifest.mf並將com/資料夾下的全部檔案歸檔到allenwells.jar中。allenwells.jar被儲存到當前資料夾。

jar uvf allenwells.jar manifest.mf
向allenwells.jar中加入manifest.mf檔案,這裡僅僅是作為普通檔案加入進去。
假設指定了-m選項,那麼manifest.mf會作為清單檔案來使用,其內容會被加入到MANIFEST.MF中。

2,*.aar,AAR(Android Archive)

1)概念

是一個Android庫專案的二進位制歸檔檔案,包含所有資源,class以及res資原始檔。

解壓:找一個aar檔案,然後修改字尾名為‘zip’或者‘rar’格式,然後解壓該檔案,開啟解壓後的資料夾,每個aar解壓後的內容可能不完全一樣,但是都會包含AndroidManifest.xml,classes.jar,res,R.txt。

2)場景

對於一些不常變動的 Android Library,我們可以直接引用 aar,加快編譯速度。

3)使用

*.aar檔案使用有兩種方式:

①線上使用(網上的)

網路載入,只要你知道*.aar檔案在maven中的路徑即可。然後引入gradle依賴。

②新增本地的*.aar檔案

在Android Studio中載入本地的*.aar檔案:
(1).把aar檔案放在一個檔案目錄內,比如就放在libs目錄內;
(2).在app的build.gradle檔案新增如下內容;

repositories {
        flatDir {
            dirs 'libs' 
        }
    }

(3).之後只需要新增一句gradle依賴便方便的引用了該aar檔案;

 dependencies {
       ...
        compile(name:'test', ext:'aar')
       ...
    }

3,

相關文章