命令行打包jar

  • 时间:
  • 浏览:12
  • 来源:跟我学网络

    对于使用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的路径包含进来.

    

    重新打包:

    

四、补充

    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包

    参考: 项目打成jar包