將java作為客戶端運行(即通過java -jar client.jar
方式運行),如有引用第三方jar包,不作特殊處理是無法正確運行,會拋出ClassNotFoundException
異常。
如以下代碼引用fastjson包
package asan.demo.client;
import com.alibaba.fastjson.JSON;
import java.util.HashMap;
import java.util.Map;
public class Client {
public Client() {
super();
}
public static void main(String[]cmd){
Map<String,String>userInfo=new HashMap<String,String>();
userInfo.put("name", "jianfeng");
userInfo.put("company", "definesys");
userInfo.put("email", "jianfeng.zheng@definesys.com");
String json=JSON.toJSONString(userInfo);
System.out.println(json);
}
}
直接打包運行,報以下錯誤
通過MF文件引入方式
標準的jar包都有一個MF文件,該文件路徑為META-INF\MANIFEST.MF
,可以將jar包解壓查看該文件,MF文件主要用來描述jar一些基本信息,如版本,作者,主類路徑等。
如以上代碼打包后MF文件內(nèi)容如下:
這里信息較少,只有版本和主類信息。注意,注意,這里總共有4行,MF文件結(jié)尾必須要有兩行空白行。
創(chuàng)建目錄
lib
該目錄和客戶端在同一個路徑下,將引用的jar包復制到lib目錄下,如圖
QQ20171015-173220@2x.png
在MF文件中增加一行(可以用壓縮軟件打開jar編輯推薦使用7-Zip)
Class-Path: ./lib/fastjson-1.2.4.jar
如有多個jar包引用空格隔開
Class-Path: ./lib/fastjson-1.2.4.jar ./lib/gson-2.2.4.jar
有兩個地方需要注意
- Class-Path后面是英文冒號,并且冒號后面有個空格
- 必須保證MF文件最后有兩行空格
這樣就可以正常運行了。
通過jar命令
將所有jar包包括客戶端放到同一目錄下,分別用jar命令解壓到當前目錄,客戶端最后解壓(避免MF文件被覆蓋)
jar -xvf fastjson-1.2.4.jar
jar -xvf Client.jar
解壓后的文件結(jié)構如圖
將所有的jar文件刪除后執(zhí)行以下命令重新打包
jar -cvfM Client.jar *
重新打包后的jar就可以正常運行
最后
兩種方式各有利弊,MF方式
第三方jar包更新無需重新打包,jar打包方式
交付的時候只要一個jar包就夠了,但第三方包更新需要重新打包。