Java - Use command line to export Runnable JAR file

回顧前面兩篇提到輸出可執行JAR檔的部分,由於透過Eclipse來輸出相對容易,因此就略過,而這邊要記錄的是怎麼透過command line的方式輸出一個可執行的JAR檔,try了一下發現要輸出一個如Eclipse類似的JAR檔好像有點不簡單,如怎麼加入library及指定要編進去的class檔等!
以上一篇透過Eclipse產出的FileTransfer.jar來看,解壓縮後結構如圖一
之中有一個設定檔META-INF/MANIFEST.MF,內容如下
Manifest-Version: 1.0
Class-Path: .
Main-Class: main.Main

Class-Path指定的是目錄下第一層
Main-Class指定的是main.Main,也就是main folder下的Main.class

因此,第一層有main、service及被解壓縮過後的library org.apache.commons.codec等

上面是透過Eclipse產出的,若自己要產生一個上面可執行的JAR檔,指令要怎麼下?
先看一下原來的專案程式結構請見圖二


官網建置指令示範如下
Create jar file
jar c[v0M]f jarfile [-C dir] inputfiles [-Joption]
jar c[v0]mf manifest jarfile [-C dir] inputfiles [-Joption] [-e entrypoint]
jar c[v0M] [-C dir] inputfiles [-Joption]
jar c[v0]m manifest [-C dir] inputfiles [-Joption]

先切換到FileTransferService下的bin folder
再來指令依序如下:
> jar xvf ../lib/commons-codec-1.15.jar
 擴展: META-INF/MANIFEST.MF
  建立: META-INF/
  建立: org/
  建立: org/apache/
  建立: org/apache/commons/
  建立: org/apache/commons/codec/
  建立: org/apache/commons/codec/binary/
  建立: org/apache/commons/codec/cli/
  建立: org/apache/commons/codec/digest/
  建立: org/apache/commons/codec/language/
  建立: org/apache/commons/codec/language/bm/
  建立: org/apache/commons/codec/net/
  建立: META-INF/maven/
  建立: META-INF/maven/commons-codec/
  建立: META-INF/maven/commons-codec/commons-codec/
....

解壓縮library內容至bin folder

最後進行打包動作
> jar cvfme ../FileTransfer.jar ../manifest.txt main.Main .
已新增資訊清單
新增: main/ (讀=0)(寫=0)(儲存 0%)
新增: main/Main.class (讀=2510)(寫=1406)(壓縮 43%)
忽略項目 META-INF/
新增: META-INF/LICENSE.txt (讀=11358)(寫=3949)(壓縮 65%)
忽略項目 META-INF/MANIFEST.MF
新增: META-INF/maven/ (讀=0)(寫=0)(儲存 0%)
新增: META-INF/maven/commons-codec/ (讀=0)(寫=0)(儲存 0%)
新增: META-INF/maven/commons-codec/commons-codec/ (讀=0)(寫=0)(儲存 0%)
新增: META-INF/maven/commons-codec/commons-codec/pom.properties (讀=60)(寫=47)(壓縮 21%)
新增: META-INF/maven/commons-codec/commons-codec/pom.xml (讀=15443)(寫=4076)(壓縮 73%)
新增: META-INF/NOTICE.txt (讀=733)(寫=383)(壓縮 47%)
...

參數說明如下:
依序為設定jar file name;指定的MANIFEST manifest.txt;entry point - main.Main;inputfiles下所有檔案(bin目錄所有內容)

檔案manifest.txt內容如下:
Class-Path: .
Main-Class: main.Main

Option說明如下:
c - Create jar file
v - 詳細的輸出說明
f - 搭配c option使用
m - 參照自己建置的manifest.txt
e -  set entry point main.Main for Main-Class attribute

FileTransfer.jar解壓縮後的檔案結構如下:
+---main
|       Main.class
|
+---META-INF
|       MANIFEST.MF
|
\---service
        Client.class
        Server.class
\---org
        \---apache
                       \---...

MANIFEST.MF內容如下:
Manifest-Version: 1.0
Class-Path: .
Created-By: 1.8.0_231 (Oracle Corporation)
Main-Class: main.Main

最後驗證輸出的JAR是否可正常work(上一篇)
> java -jar FileTransfer.jar
<<File Transfer Service>>
Start client mode -> java -jar FileTransfer.jar client [target path]
Start server mode -> java -jar FIleTransfer.jar server [share path]

留言