天天看點

Java中基本的打包jar和war檔案(包括eclipse打包操作)

前言:

為什麼要打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】

Java中基本的打包jar和war檔案(包括eclipse打包操作)

③選擇要導出包的檔案和路徑

Java中基本的打包jar和war檔案(包括eclipse打包操作)

④Next

Java中基本的打包jar和war檔案(包括eclipse打包操作)

⑤選擇Main class:

Java中基本的打包jar和war檔案(包括eclipse打包操作)

⑥測試到處的包能不能正常輸出

Java中基本的打包jar和war檔案(包括eclipse打包操作)

完全正常。

總結:其實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項目)

Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)

建立jsp頁面

Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)

 右鍵,【Run as】->【Run On Server】

Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)

②到處war包

項目右鍵->【Export】->【WAR file】

Java中基本的打包jar和war檔案(包括eclipse打包操作)
Java中基本的打包jar和war檔案(包括eclipse打包操作)

總結:到處war包相對來說比較簡單。

項目位址:https://github.com/easonjim/5_java_example/tree/master/packagetest/eclipsetest/war

三:maven

此方法省略,以後會統一詳解maven的建構。