jar包打包可以使用jar指令实现打包,在命令行中输入jar可以查看jar指令的内容
java -jar XXX.jar
命令执行,因为MANIFEST文件中未指定程序入口。而第二个实例是比较常用的打包方式,即是使用自定义的MANIFEST文件参与打包,这样能够实现往包中添加依赖,并且可以指定程序入口,实现java -jar XXX.jar
直接运行jar包。
最简单的就是在当前文件夹下将编译的class字节码文件进行打包输出。示例如下:
编写三个java文件,test1.java test2.java 以及Main.java
public class test1
{
public static void main(String[] args)
{
}
public void display()
{
System.out.println("this is class test1");
}
}
以及test2.java 文件
public class test2
{
public static void main(String[] args)
{
}
public void display()
{
System.out.println("this is class test2");
}
}
Main.java
public class Main
{
public static void main(String[] args)
{
for(String a:args)
{
System.out.println("给定的参数"+a);
}
test1 t1 = new test1();
t1.display();
test2 t2 = new test2();
t2.display();
}
}
命令行下将这三个文件进行编译,使用javac命令实现编译。
test.jar
包,可以看到如下的结构: java -jar test.jar
有如下效果: java -jar test.jar
后程序输入正确内容: 第二种打包方式更加通用,一般情况下java文件第一行都是package XXX;
即是包名,也决定了编译后的class文件存在的路径。当有多个java文件要编译打包并且他们存在不同的包名时,如果还是按照第一种方法打包时一个文件一个文件的写非常不现实,所以有了第二种方法。将所有要打包的class文件存在的目录以及依赖的jar包全部放在一个根文件夹里面(比如是foo),然后编写MANIFEST清单文件,指定程序入口以及其他添加的依赖的jar包。在执行指令:
foo/
文件夹后面有一个空格还有一个点 package cn.mytest1;
public class test1
{
public static void main(String[] args)
{
}
public void display()
{
System.out.println("this is class test1");
}
}
package cn.mytest2;
public class test2
{
public static void main(String[] args)
{
}
public void display()
{
System.out.println("this is class test2");
}
}
package cn.mymain;
import cn.mytest1.test1;
import cn.mytest2.test2;
public class Main
{
public static void main(String[] args)
{
for(String item:args)
{
System.out.println("传递参数"+item);
}
test1 t1 = new test1();
test2 t2 = new test2();
t1.display();
t2.display();
}
}
同样使用javac 指令编译,三个class文件存在于不同的路径下,因为他们包名不一样。把编译号的含有class文件的文件夹全部放在foo文件夹下:
jar cvfm test.jar MANIFEST.MF -C foo/ .
java -jar test.jar
通过上面的两个例子,可以看到MANIFEST文件对于jar打包都是必须的。MANIFEST文件描述了打包后的jar文件的详细信息,存在于打包后的META-INF 的文件夹.一个简单的MANIFEST文件主要内容如下:
java -jar name.jar
直接运行jar包。第三个Class-Path是指的打包时需要依赖的其他jar包,打包的时候自己的程序中也可能含有其他的jar包所以要添加依赖。 jar文件打包容易出错的地方就是Manifest清单文件的编写,容易出一些格式上的错误比如属性的冒号和内容之间少空格,Class-Path中添加依赖之间没有空格,依赖文件过多,多行书写的时候每行开头没加空格,文件最后一行没有空行等等。写MANIFEST文件的时候注意这些关键的地方就不会在打包上面耗费太多的时间。
原文:http://blog.csdn.net/allocator/article/details/51704846