前言:
為什么要打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:
1、JAR:
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
2、WAR:
說明:
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的構建。
