命令行打包jar

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


一、简单打包

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

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

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

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

    

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

    

    在命令行打开a1.jar:

    

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

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

    

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

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

    

    重新打包:

    

这样就可以输出结果了。


二、引用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();
	}
}

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


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


 

三、引用jar包

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

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

    

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

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

    

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

    

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

    

    重新打包:

    

猜你喜欢

转载自blog.csdn.net/whitenigt/article/details/80209472