1. 程式人生 > >Linux下編譯打包Java成Jar併成功執行

Linux下編譯打包Java成Jar併成功執行

1.Linux下編譯Java原始檔:

    1.1 編譯命令:

        javac [-d] [-o] [-verbose] [-classpath][-sourcepath]

-d: 指定生成的.class檔案存放目錄,一般省略則預設放在java原始檔同一目錄下;

        -o: 這個選項告訴javac優化內聯的static,final以及privite成員函式所產生的碼;

        -verbose:此選項告知java顯示出有關被編譯的原始檔和任何被呼叫類庫的資訊;

            如-verbose:class能看到各種載入的資訊,-verbose:gc 是garbagecollection 的資訊。

        -classpath:設定編譯時要用到的類路徑,可以是目錄,jar檔案,zip檔案(裡面都是class檔案);

            值得注意的是,此classpath可以簡寫為cp,當用到多個類時各類路徑之間用  :  相隔。

            此項也可以省略,省略則預設使用環境變數$CLASSPATH路徑。

            classpath中的內容是會覆蓋掉環境變數CLASSPATH裡面的設定。

            所以一般classpath的設定都是:當前目錄加環境變數CLASSPATH設定目錄,如

                javac  -cp .:$CLASSPATH    abc.java

        -sourcepath:設定要編譯的java檔案路徑,可以是目錄,jar檔案,zip檔案(裡面都是java檔案);

            注意,若編譯的是jar包中的主類檔案abc.java時,一般編譯整個包javac edu.test.jar或者包資料夾javac ./edu/test。

            一般當有多個java檔案需要編譯時,可以逐一列出,也可以將檔名列在一個檔案中,名稱間用空格或者回車行來進行分隔,然後在命令列中使用該列表名,名字前冠以@字元,如:

            javac @usr/test/sourcefile.list     編譯目錄usr/test 下的sourcefile.list中的java檔案    

    1.2 說明:

            1)一般對於只有一個出口主函式main,其他java檔案是以內聯類的形式被主函式呼叫的多個java檔案組成的工程來說,編譯時只需要對出口主函式main所在java檔案編譯即可,工程中的其他java檔案會自動關聯編譯;

            2)對於程式中呼叫到了第三方類或者package的情況,則一般先需要在程式檔案中加入import第三方類或者jar包;

                如 import edu.test.abc 引用jar包edu.test下的abc.java,為穩妥,一般都引用整個包內檔案import edu.test.*編譯時需要將jar包路徑或者資料夾根目錄,如edu的路徑加入到classpath中。一般常把jar包或者根資料夾拷貝到當前目錄下,指定classpath為.,編譯器自動會從當前目錄開始尋找。

    1.3 例項:

        javac -cp .:/home/Test/lib/commons-collections-3.2.2.jar -d . *.java

2.將Java原始檔打成Jar包:

    2.1 打包命令:

        jar {ctxu}[vfm0M][jar-檔案] [manifest-檔案] [-C 目錄] 檔名

       其中 {ctxu} 是 jar命令的子命令,每次 jar 命令只能包含 ctxu 中的一個,它們分別表示:

        -c:建立新的 JAR 檔案包;

        -t:列出 JAR 檔案包的內容列表;

        -x:展開 JAR檔案包的指定檔案或者所有檔案;

        -u:更新已存在的 JAR 檔案包(新增檔案到 JAR 檔案包中);

       特別注意,在引數的下達中, c/x/t/u僅能存在一個,不可同時存在!因為不可能同時壓縮與解壓縮。

        -z:是否同時具有 gzip的屬性?亦即是否需要用 gzip 壓縮;

        -j:是否同時具有 bzip2的屬性?亦即是否需要用 bzip2 壓縮;

        -v:壓縮的過程中顯示檔案!這個常用,但不建議用在背景執行過程;

        -f:指定 JAR檔名,通常這個引數是必須的;

        請留意,在 f之後要立即接檔名喔!不要再加引數!

        比如:

           『 tar -zcvfP tfile sfile』就是錯誤的寫法,

           『 tar -zcvPf tfile sfile』才是正確的寫法。

        -p:使用原檔案的原來屬性(屬性不會依據使用者而變;

        -P :可以使用絕對路徑來壓縮;

        -N:比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔案;

        -excludeFILE:在壓縮的過程中,不要將 FILE 打包;

        -m:指定需要包含的 MANIFEST清單檔案;

        -0:只儲存,不壓縮,這樣產生的 JAR檔案包會比不用該引數產生的體積大,但速度更快;

        -M:不產生所有項的清單(MANIFEST〕檔案,此引數會忽略-m 引數;

        [jar-檔案]:即需要生成、檢視、更新或者解開的 JAR 檔案包,它是 -f 引數的附屬引數;

        [manifest-檔案]:即MANIFEST 清單檔案,它是 -m 引數的附屬引數

        [-C 目錄]表示轉到指定目錄下去執行這個 jar 命令的操作,它相當於先使用 cd 命令轉該目錄下再執行不帶 -C 引數的命令,它只能在建立和更新 JAR檔案包的時候可用。

        檔名:指定一個檔案/目錄列表,這些檔案/目錄就是要新增到 JAR 檔案包中的檔案/目錄。如果指定了目錄,那麼jar命令打包的時候會自動把該目錄中的所有檔案和子目錄打入包中。

2.2 例項:

    jar -cvf IDMatch_V1.jar *.class

3.執行jar包:

    3.1 執行命令:

        1、java -jar xxxxx.jar 

            當前ssh視窗被鎖定,可按CTRL + C打斷程式執行,或直接關閉視窗,程式退出。

        2、java -jar xxxxx.jar &                

            當前ssh視窗不被鎖定,但是當視窗關閉時,程式中止執行。

        3、nohup Java -jar xxxxxx.jar &         

            不掛斷執行命令,當賬戶退出或終端關閉時,程式仍然執行。

    3.2 例項:

        java -cp .:/home/Test/lib/commons-collections-3.2.2.jar:./Test.jar com.test.datahandle.Test