一、打包
新建目录tmp,进入该目录
1.新建MyLib.java文件,内容如下:
public class MyLib{
public static void sayHello(){
System.out.println("Hello World");
}
// 主函数
public static void main(String[] args) {
System.out.print("自调用 => ");
sayHello();
}
}
2.编译java文件
/tmp> javac MyLib.java
3.新建清单文件
新建一个文件manf,内容为:
Main-Class: MyLib
(注意清单文件规范:在冒号后面有一个空格,行末不能有空格,最后要空一行)
4.执行打包命令
/tmp> jar cvfm mylib.jar manf MyLib.class
已添加清单
正在添加: MyLib.class(输入 = 531) (输出 = 364)(压缩了 31%)
(如果打包的时候没有包含清单文件,程序就不知道主类,会提示“mylib.jar中没有主清单属性”)
目录如下:
5.运行jar包
/tmp> java -jar mylib.jar
自调用 => Hello World
二、引用class文件
java引用class文件
// 目录结构
tmp
├─test
│ ├─MyLib.java
│ └─MyLib.class
├─Main.java
└─Main.class
Main.java内容:
import test.MyLib;
public class Main{
// 主函数
public static void main(String[] args) {
MyLib.sayHello();
}
}
MyLib.java内容:
package test;
public class MyLib{
public static void sayHello(){
System.out.println("Hello World");
}
// 主函数
public static void main(String[] args) {
System.out.print("自调用 => ");
sayHello();
}
}
注意目录结构和包名的关系,执行命令
/tmp> javac Main.java
/tmp> java Main
Main类会在test包(目录)下查找MyLib类的class文件,存在该类则自动编译成对应class文件。
三、引用jar包
java引用jar
// 目录结构
tmp
├─test
│ ├─MyLib.java
│ └─MyLib.class
├─manf
├─Main.java
└─Main.class
MyLib.java内容:
package test;
public class MyLib{
public static void sayHello(){
System.out.println("Hello World");
}
// 主函数
public static void main(String[] args) {
System.out.print("自调用 => ");
sayHello();
}
}
manf文件:
Main-Class: test.MyLib
Class-Path: mylib.jar
Main.java内容:
import test.MyLib;
public class Main{
// 主函数
public static void main(String[] args) {
MyLib.sayHello();
}
}
编译命令顺序为
/tmp/test> javac MyLib.java
/tmp/test> cd ..
/tmp> jar cvfm mylib.jar manf test/MyLib.class
/tmp> javac -cp mylib.jar Main.java
/tmp> java -classpath mylib.jar; Main
Hello World
四、补充
Main-Class中类如果有限定名,则写成全限定名,比如package.classname
Class-Path中引用多个jar包,则以换行分隔多个jar包的相对路径
当要进入到某个目录下执行jar 则加上-C命令。当进入到指定目录,且要打包该目录下所有文件,则加上“." 指定当前路径下所有文件即可。同时加上-C后,注意manf文件中的Class-Path是相对于-C参数指定的目录
使用jar -e参数可以不用manf文件配置,直接在命令中配置运行主类,命令如下:
> jar cfe xxx.jar entry.Main entry/*
# 其中xxx.jar为要打包成的jar名称, entry目录存放着编译好的类, entry目录下Main.class是运行主类
# 执行完成后 xxx.jar即为可运行的jar包