一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

jar命令(一)

 米祝fg2005clxo 2018-01-24

jar包本質(zhì)上是將所有class文件、資源文件壓縮打成一個包(也可以選擇不壓縮),可選擇在jar包中生成META-INF/MANIFEST.MF文件,MANIFEST.MF是清單文件,里面可以記錄主類、classpath等信息,供虛擬機使用。
接下來的一段時間里,我們將以以下路徑學(xué)習(xí)jar命令和清單文件的相關(guān)知識

  1. jar打包class文件
  2. 帶包class文件jar打包
  3. 清單文件的使用

在這篇文章里我們將使用簡單的java程序來熟悉jar命令的使用,因為是出于熟練使用jar的目的,下面的操作中可能會啰里啰嗦、重復(fù)使用jar命令,以下是本片文章的目錄,精簡版直接看 jar命令的選項

一. jar命令的選項

用法:

大括號中的選項是必選的,中括號里選項是可選的,jar-file是jar文件;manifest-file是清單文件,即jar包中的META-INF/MANIFEST.MF文件

jar {ctxui}[vfmn0PMe] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
  • 1
  • 2

選項:

-c  (create)創(chuàng)建新檔案
-t  列出檔案目錄
-x  從檔案中提取指定的 (或所有) 文件
-u  (update)更新現(xiàn)有檔案
-v  在標(biāo)準(zhǔn)輸出中生成詳細(xì)輸出
-f  指定檔案文件名
-m  包含指定清單文件中的清單信息
-n  創(chuàng)建新檔案后執(zhí)行 Pack200 規(guī)范化
-e  為捆綁到可執(zhí)行 jar 文件的獨立應(yīng)用程序
    指定應(yīng)用程序入口點
-0  僅存儲; 不使用任何 ZIP 壓縮
-P  保留文件名中的前導(dǎo) '/' (絕對路徑) 和 ".." (父目錄) 組件
-M  不創(chuàng)建條目的清單文件
-i  為指定的 jar 文件生成索引信息
-C  更改為指定的目錄并包含以下文件
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

本節(jié)中使用到的命令

jar uf xx.jar [file … | path]是需要注意的,它在更新完jar文件后會生成新的清單文件,這一點在本篇文章的 “方法4:為jar更新文件,文件是清單文件” 中有實例說明

jar cf xx.jar [file ... | path]  將file等文件或path目錄打包成xx.jar
jar cvf xx.jar [file ... | path]  同上,顯示詳細(xì)信息
jar cmf manifest-file xx.jar [file ... | path]  將file等文件或path目錄打包到xx.jar,并制定它的清單文件
jar cMf xx.jar [file ... | path]  將file等文件或path目錄打包到xx.jar,包中不生成清單文件
jar uf xx.jar [file ... | path]  將file等文件或目錄更新到xx.jar,務(wù)必注意!?。∵@個更新會重新生成清單文件
jar uMf xx.jar [file ... | path]  同上,但不會生成清單文件
jar umf manifest-file xx.jar {file ... | path}  將file等文件或path目錄更新到xx.jar
jar tf xx.jar  列出xx.jar中所有文件
jar xf xx.jar  把xx.jar中所有文件提取到當(dāng)前目錄
jar xf xx.jar {file ...}  把xx.jar中file等文件提取到當(dāng)前目錄
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

二. 只有一個class文件的可執(zhí)行jar的實現(xiàn)

首先創(chuàng)建一個jarDemo文件夾,里面放置我們的測試類

mkdir jarDemo
cd jarDemo
touch Main.java
  • 1
  • 2
  • 3

在Main.java里面添加我們的hello world代碼,并javac編譯

public class Main{
    public static void main(String ... args){
        System.out.println("hello world");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
javac Main.java
  • 1

然后將生成的Main.class打包,c選項是創(chuàng)建一個新的jar包,f是指定jar包的名字

jar cf Main.jar Main.class
  • 1

如果附加使用v選項,則會列出詳細(xì)的打包信息

jar cvf Main.jar Main.class
  • 1

我們可以通過t選項來查看生成的jar中的文件,輸出的內(nèi)容也就是包目錄和包文件,可以看到是默認(rèn)生成MANIFEST.MF文件的

jar tf Main.jar

輸出:
META-INF/
META-INF/MANIFEST.MF
Main.class
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

當(dāng)然我們也可以通過M選項不生成MANIFEST.MF文件,可以看到包中只有Main.class一個文件

rm Main.jar
jar cMf Main.jar Main.class
jar tf Main.jar

輸出:
Main.class
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

雖然我們已經(jīng)將Main.class打包了,并且Main.class有main(String … args)入口方法,可是這個jar還是不能執(zhí)行,因為虛擬機并不知道這個包中的哪個class中是有main方法的

java -jar Main.jar

輸出:
Main.jar中沒有主清單屬性
  • 1
  • 2
  • 3
  • 4

下面還是恢復(fù)到有MANIFEST.MF文件的Main.jar包,我們要將他解壓,在MANIFEST.MF中添加主類屬性
解壓jar包的方法有很多種,我們解壓的目的是為了查看默認(rèn)生成的MANIFEST.MF文件,并做修改,最后生成一個可執(zhí)行的jar包,因為我們的目的是出于熟練使用jar命名,下面我們將使用多個方法實現(xiàn)這個目標(biāo)

方法一:將Main.jar全部解壓,修改MANIFEST.MF文件后再重新打包

因為jar解壓命令只能解壓到當(dāng)前目錄,這樣會造成文件混亂,我們新建一個uncompress文件夾,將Main.jar拷貝到這個文件夾后再解壓,可以看到,jar包中所有文件,x選項是提出全部或指定文件,這個例子里是提出全部文件,實際中可以用f選項提出指定文件,比如 >> jar xf Main.jar META-INF/MANIFEST.MF

mkdir uncompress
cp Main.jar uncompress
cd uncompress
jar xf Main.jar
ls -RF

輸出:
META-INF/   Main.class  Main.jar

./META-INF:
MANIFEST.MF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

打開META-INF/MANIFEST.MF文件,看到默認(rèn)生成的清單文件很簡單,只有兩行

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)
  • 1
  • 2
  • 3

添加上添加上主類屬性,注意冒號后面一定要留一個空格,最后一定要多留一個換行符

Manifest-Version: 1.0
Created-By: 1.8.0_101 (Oracle Corporation)
Main-Class: Main
  • 1
  • 2
  • 3
  • 4

然后使用再將uncompress中所有目錄、文件全部打包,注意先將原來的Main.jar刪除,最后就可以運行這個新的有主類屬性的Main.jar啦

rm Main.jar
jar cMf Main.jar .
java -jar Main.jar

輸出:
hello world
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

注意上面這個jar命令使用的M選項是不生成清單,因為原本uncompress目錄里就有,如果還是使用jar cf命令,生成的清單和上面第一次打包生成清單的是一樣的,沒有Main-Class: Main主類

rm Main.jar
jar cf Main.jar .
java -jar Main.jar

輸出:
Main.jar中沒有主清單屬性
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法二:生成jar包的時候為其指定清單文件

還是那個方法一的uncompress目錄,我們把META-INF下的MANIFEST.MF移到uncompress目錄下,刪除Main.jar,和META-INF目錄,讓uncompress中只有Main.class和MANIFEST.MF兩個文件,MANIFEST.MF是有主類屬性的清單文件

mv META-INF/MANIFEST .
rm Main.jar
rm -r META-INF
ls -RF

輸出:
MANIFEST.MF Main.class
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

接下了指定清單文件,生成Main.jar,m選項可以指定一個清單文件

jar cmf MANIFEST.MF Main.jar Main.class
java -jar Main.jar

輸出:
hello world
  • 1
  • 2
  • 3
  • 4
  • 5

方法三:為jar包指定清單文件

還記得最早那個jardemo目錄里的那個清單里沒有主類的Main.jar嗎,我們?yōu)樗掠兄黝惖那鍐挝募?
jardemo/uncompress目錄下的的MANIFEST.MF是有主類的,我們把它移到j(luò)ardemo目錄下

cd desktop/jardemo
mv uncompress/MANIFEST.MF .
rm -r uncompress
ls -RF

輸出:
MANIFEST.MF Main.class  Main.jar    Main.java
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

使用u選項更新jar包,使用m選項指定清單文件,輸出了一些警告信息,因為新的清單文件和Main.jar包中原來的清單信息有兩個字段是重名的

jar -umf MANIFEST.MF Main.jar

輸出:
三月 13, 2017 10:50:50 下午 java.util.jar.Attributes read
WARNING: Duplicate name in Manifest: Manifest-Version.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
三月 13, 2017 10:50:50 下午 java.util.jar.Attributes read
WARNING: Duplicate name in Manifest: Created-By.
Ensure that the manifest does not have duplicate entries, and
that blank lines separate individual sections in both your
manifest and in the META-INF/MANIFEST.MF entry in the jar file.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

再運行這個jar

java -jar Main.jar

輸出:
hello world
  • 1
  • 2
  • 3
  • 4

方法四:為jar更新文件,文件是清單文件

使用這個方法主要是為了再次熟悉一下u選項和理解包的概念
我們在jardemo目錄里刪除有主類清單的Main.jar,再次生成最早的MANIFEST.MF中沒有主類的Main.jar

jar cf Main.jar Main.class
  • 1

jar包中的MANIFEST.MF里記錄了主類,而MANIFEST.MF只是jar包中的一個文件,我們將Main.jar中沒有主類的MANIFEST.MF替換為有主類的MANIFEST.MF和方法三是同樣的效果,首先要講有主類的MANIFEST.MF放在合適的路徑里面,我們之前看到j(luò)ar包中的文件是放在META-INF目錄里的,使用u來更新jar,注意需要使用M來忽視清單文件

mkdir META-INF
mv MANIFEST.MF META-INF
jar uMf Main.jar META-INF/MANIFEST.MF
java -jar Main.jar

輸出:
hello world
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三. 多個class的打包

上一節(jié)中,jarDemo目錄中有Main.java和有主類信息的清單文件MANIFEST.MF,我們只保留這兩個個文件,其他全部刪掉,然后新建一個Say.java文件

ls -RF

輸出:
META-INF/   Main.java   Say.java

./META-INF:
MANIFEST.MF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在新建的Say.java:

public class Say{
    public static void say(String str){
        System.out.println("This is " + str);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5

修改Main.java文件,讓它調(diào)用Say類中的Say.say(…)方法

public class Main{
    public static void main(String ... args){
        System.out.println("hello world");
        Say.say("Charles");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

我們編譯文件并打包,注意指定一個那個有主類屬性的MANIFEST.MF

javac *.java
jar cmf Main.jar META-INF/MANIFEST.MF Main.class Say.class
java -jar Main.jar

輸出:
hello world
This is Charles
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    日韩精品人妻少妇一区二区| 精品国产亚洲av成人一区| 欧美成人精品国产成人综合| 日韩国产中文在线视频| 亚洲国产av在线视频| 中文日韩精品视频在线| 视频一区二区三区自拍偷| 中文字幕日韩精品人一妻| 男女一进一出午夜视频| 国产成人精品一区二三区在线观看 | 精品一区二区三区免费看| 国产极品粉嫩尤物一区二区| 欧美美女视频在线免费看| 99精品人妻少妇一区二区人人妻| 婷婷激情五月天丁香社区| 中字幕一区二区三区久久蜜桃| 日韩一本不卡在线观看| 国产精品免费不卡视频| 特黄大片性高水多欧美一级| 久久综合狠狠综合久久综合| 日本高清一道一二三区四五区 | 最近最新中文字幕免费| 人妻中文一区二区三区| 精品亚洲av一区二区三区| 九九久久精品久久久精品| 乱女午夜精品一区二区三区| 国产精品欧美激情在线观看| 偷自拍亚洲欧美一区二页| 国产一级特黄在线观看| 好东西一起分享老鸭窝| 夜夜躁狠狠躁日日躁视频黑人| 亚洲国产日韩欧美三级| 亚洲一区二区三区免费的视频| 在线观看国产午夜福利| 内射精子视频欧美一区二区| 日本高清一道一二三区四五区 | 色婷婷国产熟妇人妻露脸| 国产视频福利一区二区| 国内精品伊人久久久av高清| 国产精品免费精品一区二区 | 亚洲精品高清国产一线久久|