将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文件内容如下:
这里信息较少,只有版本和主类信息。注意,注意,这里总共有4行,MF文件结尾必须要有两行空白行。
创建目录
lib
该目录和客户端在同一个路径下,将引用的jar包复制到lib目录下,如图
在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
解压后的文件结构如图
将所有的jar文件删除后执行以下命令重新打包
jar -cvfM Client.jar *
重新打包后的jar就可以正常运行
最后
两种方式各有利弊,MF方式
第三方jar包更新无需重新打包,jar打包方式
交付的时候只要一个jar包就够了,但第三方包更新需要重新打包。