前言:
為什麼要打jar包?
1、舉個例子,當編寫一個工具類庫,裡面有十幾個類,每個類對應一個class檔案時,為了友善别人調用,是不是要裝在一個檔案中,友善傳遞和引用。
2、打jar包還有一個好處,就是不包含源檔案,對于一些機密資訊的庫,jar包和代碼混濁是一個首選。
3、友善部署和引用。
打包jar有兩類,包含main入口和不包含main入口的(大概的意思是比如一些jar是直接類庫引用的,不需要執行,這些就不用包含main入口),這裡一般都是包含main入口的進行測試。包含main入口也叫做可執行jar檔案。
在打包可執行jar檔案時,通常會有一個指定Main-Class入口的檔案MANIFEST.MF,一般這個檔案是放置在META-INF目錄。詳細的配置參考:http://www.cnblogs.com/EasonJim/p/6485677.html
war是針對web項目的,同時war包也是為了友善部署。
經過測試,在web項目上也能到處jar包,如果指定了Main-Class入口,也是能正常輸出的。
JAR和WAR包的本質差別應該在于目錄的結構,其打包的指令都是jar去完成的;結構參考:http://www.cnblogs.com/EasonJim/p/6498804.html
一、指令行:
1、JAR:
jar指令行的說明:jar -h
用法: jar {ctxui}[vfmn0Me] [jar-file] [manifest-file] [entry-point] [-C dir] files ...
選項:
-c 建立新檔案
-t 列出檔案目錄
-x 從檔案中提取指定的 (或所有) 檔案
-u 更新現有檔案
-v 在标準輸出中生成詳細輸出
-f 指定檔案檔案名
-m 包含指定清單檔案中的清單資訊
-n 建立新檔案後執行 Pack200 規範化
-e 為綁定到可執行 jar 檔案的獨立應用程式
指定應用程式入口點
-0 僅存儲; 不使用任何 ZIP 壓縮
-M 不建立條目的清單檔案
-i 為指定的 jar 檔案生成索引資訊
-C 更改為指定的目錄并包含以下檔案
如果任何檔案為目錄, 則對其進行遞歸處理。
清單檔案名, 檔案檔案名和入口點名稱的指定順序
與 'm', 'f' 和 'e' 标記的指定順序相同。
示例 1: 将兩個類檔案歸檔到一個名為 classes.jar 的檔案中:
jar cvf classes.jar Foo.class Bar.class
示例 2: 使用現有的清單檔案 'mymanifest' 并
将 foo/ 目錄中的所有檔案歸檔到 'classes.jar' 中:
jar cvfm classes.jar mymanifest -C foo/ .
注意:jar打包也叫壓縮,就唯一一個方法。
假設我已經建立好代碼檔案,命名為MyProgram.java,内容如下:
package jartest;
public class MyProgram {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("hello world");
}
}
注意:上面包含了包名jartest。
接下來要做的就是使用javac進行編譯出位元組碼class檔案。指令如下:
javac jartest/MyProgram.java
測試編譯出的位元組碼在運作上會有所不同,你不能進入到jartest檔案夾來運作,隻能在外部這樣執行:
java jartest.MyProgram
然後在最外層目錄上建立MANIFEST.MF檔案,内容如下:
Manifest-Version: 1.0
Main-Class: jartest.MyProgram
注意:上面的内容上要留多一行空的,不然無法識别。
接下來就是測試指令行:
參考:http://www.jb51.net/article/43033.htm
這裡假設我的檔案放在這個目錄:D:\開發工程\GitHub\5_java_example\packagetest\commandlinetest\jar\,那麼指令行需要進入到這個目錄下。
①打包
jar cf JAR檔案名稱 程式檔案名稱或者程式所在的檔案夾(可以使用通配符查找檔案)
舉例:
jar cf MyApp.jar jartest\MyProgram.class
②檢視一個jar檔案的内容
jar tvf JAR檔案名稱
jar tvf MyApp.jar
③将一個jar檔案解壓縮
jar xf JAR檔案名稱
jar xf MyApp.jar
④往壓縮包裡面增加檔案
jar xf JAR檔案名稱 添加的檔案或者其他的jar檔案
jar xf MyApp.jar jartest\MyProgram_new.class.class
⑤更新一個jar檔案
jar uf JAR檔案名稱 更新的檔案或者其他的jar檔案
jar uf MyApp.jar jartest\MyProgram_new.class.class
⑥建立一個可以運作的jar檔案
jar cvfm MyApp.jar MANIFEST.MF 檔案或檔案夾路徑
jar cvfm MyApp.jar MANIFEST.MF jartest\MyProgram.class
⑦運作一個jar程式
java -jar JAR檔案名稱
java -jar MyApp.jar
測試工程:https://github.com/easonjim/5_java_example/tree/master/packagetest/commandlinetest/jar
2、WAR:
經過研究,打war包也是通過jar指令進行完成,不同的是字尾變了,是以直接運作上面的打包指令即可。
二、GUI工具eclipse:
eclipse下打jar包相對來說比較簡單,不用關心MANIFEST.MF檔案的編寫,隻需要把核心放在代碼上即可。
具體操作:
說明:假設已經建立好工程,下面就是直接GUI的操作。
①項目->【右鍵】->【Export】
②選擇【JAR file】
③選擇要導出包的檔案和路徑
④Next
⑤選擇Main class:
⑥測試到處的包能不能正常輸出
完全正常。
總結:其實eclipse這樣的GUI工具非常友善的到處jar包,并且可以選擇其它的選項,而且免去自己手動配置這些檔案的問題。
項目位址:https://github.com/easonjim/5_java_example/tree/master/packagetest/eclipsetest/jar
說明:
war包一般針對web項目,但是經過測試web項目也能到處jar包,并可以指定入口,也就是可以執行。
war包一般是部署到容器中運作,比如tomcat,但是用jetty可以實作内嵌web的方式,然後用java -jar去運作,進而實作可執行的war包方式。這裡先不講解這種方式,後面再開專題詳解研究。可以參考:https://www.eclipse.org/jetty/。線索:jetty内嵌war、war内嵌tomcat。
這裡假設已經建立好web項目。
①建立web項目(重點在如何建立jsp項目)
建立jsp頁面
右鍵,【Run as】->【Run On Server】
②到處war包
項目右鍵->【Export】->【WAR file】
總結:到處war包相對來說比較簡單。
項目位址:https://github.com/easonjim/5_java_example/tree/master/packagetest/eclipsetest/war
三:maven
此方法省略,以後會統一詳解maven的建構。