命令行编译java程序 —— 打包jar包和引用jar包

一、打包

新建目录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包

参考:

猜你喜欢

转载自blog.csdn.net/Necrolic/article/details/105642018