使用IDE打包是很容易的事情,但是某些情况不能使用IDE,只能使用命令行打包
jar -cvf my.jar -C target .
-C target . 参数,指定把 target 目录下的所有文件打包
执行需要指定程序入口,否则报错no main manifest attribute,因为java 不知道应该执行什么。
注意:命令最后的点,表示所有文件,C参数后的目录需要是编译的目标目录,是package的上级目录,如果代码的package是com.a.b,切忌不要选择com或以下目录。Package目录和文件夹路径一致,否则找不到class。
target
|—-com
|—-a
|—–b
java -jar my.jar
正确的执行方式
java -cp my.jar com.demo.Hello
-cp my.jar 把 jar 包添加到 classpath 目录
com.demo.Hello 说明哪个类是入口
打包可执行 jar
可以直接执行,无需指定入口
创建MANIFEST.MF文件,位置可以任意不必放在META-INF下,打包程序会自动创建META-INF,在文件内说明程序入口:
Main-Class: com.demo.Hello
再次打包
添加了 m 参数,指定 MANIFEST.MF,这个文件的内容会被添加到 jar 包的清单,用于说明 my.jar 的入口
jar -cvfm my.jar MANIFEST.MF -C target .
依赖第三方 jar 包的 java 代码的编译执行
创建文件 src/com/demo/HelloGson.java,这个代码依赖 gson 包:
package com.demo;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
public class HelloGson {
public static void main(String[] args) {
Gson gson = new Gson();
Map map = new HashMap();
map.put(“key1”, “value1”);
map.put(“key2”, “value2”);
String json = gson.toJson(map);
System.out.println(json);
}
}
直接编译:
javac src/com/demo/HelloGson.java -d target
此时会报错 error: package com.google.gson does not exist,因为依赖包不存在
创建 libs 目录,把依赖包 gson-2.8.5.jar 放进去,最后整个目录结构如下:
添加classpath参数再次编译,使用 -cp libs/gson-2.8.5.jar 参数添加依赖包:
javac -cp libs/gson-2.8.5.jar src/com/demo/HelloGson.java -d target
执行时也需把 libs/gson-2.8.5.jar 添加到 classpath 路径中:
java -cp target:libs/gson-2.8.5.jar com.demo.HelloGson
否则会报错缺少依赖 java.lang.ClassNotFoundException
手动添加Class-Path正确方法
Manifest-Version: 1.0
Class-Path: . testPackage2_lib/fastjson-1.2.38.jar
Main-Class: com.mym.practice.testpackage.MainClass
注意
• (1)有多个jar引用要换行写
• (2)注意Class-Path的冒号与右边字符有空格,并且有个点“.”不能漏了,看很多文章都没有说到这个点,导致即使加了这个也没用。这个点的由来可以参考配置jdk环境变量配置classpath时是一样的
如果未把jar包打包进去,如何避免运行找不到依赖包
1、不推荐:把依赖的jar全部放到JRE的扩展类文件夹中(%JAVA_HOME%/jre/lib/ext)
2、使用 -Djava.ext.dirs=../lib
相关文章