命令行打包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的路径包含进来.
重新打包:
下一篇: php中各种运算符介绍以及实例说明