1. 程式人生 > >將java工程打包成jar包

將java工程打包成jar包

1. 準備MANIFEST.MF檔案

1)若生成的jar包直接匯入java工程中使用,可以不用MANIFEST.MF檔案,直接在工程中匯入jar包引用到的第三方包;
2)若生成的jar包需要放到伺服器上跑,在jar包的存放路徑下同時存放一個lib資料夾,在該資料夾中存放第三方包,如圖所示:
這裡寫圖片描述
再在MANIFEST.MF檔案中指定第三方包的位置,MANIFEST.MF中內容如下:

Manifest-Version: 1.0
Class-Path: lib/ansj_seg-5.0.2-all-in-one.jar lib/args4j-2.0.6.jar
lib/glpk-java.jar lib/hanlp-1.3.4.jar lib/ik-analyzer-solr5-5.x.jar
lib/javailp-1.2a.jar lib/jgibblda.jar lib/poi-3.15.jar lib/weka.jar
Main-Class: edu.ecnu.dase.sm.SMTester

第一行是MAINIFEST的版本,第二行Class-Path就指定了外來jar包的位置,第三行指定我們要執行的MAIN java檔案。

這裡要注意幾點:

複製程式碼
1、Class-Path: 和Main-Class: 後邊都有一個空格,必須加上,否則會打包失敗,錯誤提示為:Invalid header field;

2、假設我們的專案打包後為SumECNU4.0.jar,那麼按照上面的定義,應該在 SumECNU4.0.jar的同層目錄下建立一個lib資料夾(即lib檔案和打包的jar檔案在同一個目錄下),並將相關的jar包放在裡面。否則將會出現“Exception in thread “main” java.lang.NoClassDefFoundError”的錯誤;

3、Main-Class後面是類的全地址,比如你的主檔案是SMTester.java,檔案裡打包為package edu.ecnu.dase.test; 那麼這裡就寫edu.ecnu.dase.test.SMTester,不要加.java字尾,主檔案地址寫錯將會出現“找不到或無法載入主類”的錯誤;

4、寫完Main-Class後一定要回車(即最後一行是空白行),讓游標到下一行,這樣你生成的jar包才能找到你的主class去執行,否則將會出現“jar中沒有主清單屬性”的錯誤。

2. 右擊Java工程選擇Export—>選擇JAR file—>Next

這裡寫圖片描述

3. 選擇要打包的檔案,不需要的檔案不必打包,減小打包後的jar檔案大小,並進行選項配置如下

這裡寫圖片描述
第一次打包的時候,將data、models、doc資料夾和stop_words_ch.txt檔案都新增進去了,生成的jar包178M,後來發現在引用這個jar包的工程中還是需要匯入這些檔案,否則程式碼報錯,說明這些檔案打包在jar中並不能起到作用。
第二次打包就只添加了src進去,生成jar包只有159k,可以說是專業點的jar包了。

其中有幾個選項的含義:

Export generated class files and resources 表示只匯出生成的.class檔案和其他資原始檔
Export all output folders for checked projects 表示匯出選中專案的所有資料夾
Export java source file and resouces 表示匯出的jar包中將包含你的原始碼*.java,如果你不想洩漏原始碼,那麼就不要選這項了
Export refactorings for checked projects 把一些重構的資訊檔案也包含進去

4. 選擇我們在第一步中自定義的配置檔案路徑

這裡寫圖片描述
1) 若是1. 中的1) 情況,直接選擇預設選項就好。
2)若是1. 中的2)情況,則一定不能預設選項,選擇第一步自定義配置檔案MANIFEST.MF的路徑

其中幾個選項的含義:

Generate the manifest file:是系統幫我們自動生成MANIFEST.MF檔案,如果你的專案沒有引用其他class-path,那可以選擇這一項。
Use existing mainfest from workspace:這是可以選擇我們自定義的.MF檔案,格式如上所寫,引用了第三方包時選用。
Seal content:要封裝整個jar或者指定的包packet。
Main class:這裡可以選擇你的程式入口,將來打包出來的jar就是你這個入口類的執行結果。

最終生成jar包。

5. 執行jar包方法

  1. 在命令列下執行命令java -jar 你的jar檔名稱
    如果在jar中有一些System.out.prinln語句(如上執行結果),執行後不想在控制檯輸出而是儲存在檔案中方便以後檢視,可以用一下命令:
    java -jar SumECNU4.0.jar > log.txt (這時命令列視窗不會有任何輸出)
    輸出資訊會被列印到log.txt中,當然log.txt自動生成,並位於和SumECNU4.0.ar一個目錄中。
  2. 新建一個批處理檔案,如start.bat,內容為:java -jar SumECNU4.0.jar,放在jar檔案同一目錄下即可,以後點選自動執行即可,更加方便。

jar包中使用到的檔案,放在jar包同路徑下即可。

6. 遇見的問題

當我將生成的jar包以及用到的第三方jar包匯入到新的工程中使用時,發生了各種報錯,但是原始碼執行沒有任何問題。當我開始懷疑是不是生成的jar包有問題時,發現是生成的jar包需要引用的第三包有問題,換用其他版本的第三方jar包之後,執行成功!