欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

命令行打包jar

程序员文章站 2022-06-05 17:10:29
...

    对于使用Eclipse自动打包jar比较方便,但是如果不加限制结果可能jar中包含很多其他多余文件。因此可以自定义打包样式,在命令行使用jar命令完成java程序打包.


一、简单打包

    新建一个目录tmp,进入该目录.

    新建Hello.java文件,内容如下:

public class Hello{
	public static void main(String[] args){
		System.out.println("Hello World");
	}
}

   在当前目录下使用命令行:

    命令行打包jar

    此时目录下文件应该是这样:

    命令行打包jar

    在命令行打开a1.jar:

    命令行打包jar

    这是因为之前在打包的时候没有包含清单文件,因此程序不知道主类

    下面为之前的程序添加清单,首先在当前目录下新建一个文件manf,内容为Main-Class: Hello

    命令行打包jar

    清单文件的规范,在冒号后面要有一个空格,行末不能有空格,最后一行是空行

    那么此时当前目录下的样子是:

    命令行打包jar

    重新打包:

    命令行打包jar

这样就可以输出结果了。


二、引用class文件

    上面只是简单的一个类进行打包,如果一个类引用了另外一个类,会怎么样?

    在当前目录下新建一个新的目录test,然后在test目录下新建一个Get.java文件,内容:

public class Get{
	public void print(){
		System.out.println("引用类");
	}
}

    同时修改前面的Hello.java,让该文件引用Get类.修改后的Hello.java应该是这样的:

import test.Get;
public class Hello{
	public static void main(String[] args){
		Get aget=new Get();
		aget.print();
	}
}

下面开始编译上面的两个类文件:

命令行打包jar

可以发现Get.java正确编译了,但是编译Hello.java却报错.这是因为在Hello.java中import test.Get中将test作为包处理,然而在Get.java中并没有声明包围test,因此找不到test包下面的Get.class文件。正确做法,应该是重新修改Get.java文件,再该文件中加上package test,再重新编译.

命令行打包jar

 

三、引用jar包

    对于引用的不是class文件,而且一个打包好的Jar,那么该怎么将引用的jar包含进来从而完成打包?

    首先,在上面打包的a3.jar中是存在test/Get.class文件,因此我们可以删除当前目录下的test目录,大致如下结构:

    命令行打包jar

      由于删除了test目录,因此在Hello.java文件中Import test.Get实际上是针对于a3.jar,因为test目录只在a3.jar中有.

    因此要将a3.jar包含进来打包. 可以在我们正准备编译Hello.java的时候却发生错误

    命令行打包jar

    这是因为刚刚我们删除了test目录,当然在编译Hello.java的时候找不到包test. 但是我们知道在a3.jar中是存在test目录的,因此可以将a3.jar包含进来编译运行:

    命令行打包jar

    可以正常打包后,使用的时候却又报错. 解决方法是在清单文件中指明类加载路径,将Jar的路径包含进来.

    命令行打包jar

    重新打包:

    命令行打包jar

相关标签: jar打包