storage R&D guy.
全部博文(1000)
分类: 服务器与存储
2015-10-20 14:54:05
今天想试试Linux系统下把java应用程序打包成.jar文件,在网上找了很多相关的博客,发现他们理论讲得很到位,但是按照他们的方式操作发现很多错误,最后综合几篇文章终于尝试成功。多学习别人的失败,更容易带你走向成功,现在把自己操作过程罗列出来(步骤中有部分错误,正是在错误中一步步摸索才获得了最终的成功)。至于理论部分我会在文章末尾贴出来(参考别人文章写的)。如果我理论部分整理的不是很好的话,你可以多参考网上的文章。
实验前准备:FileLength.java 文件一份
实验环境:CentOS6.0 JDK1.6.0_03
实验目的:将FileLength.java文件打包成test.jar文件
实验步骤:
<1>javac FileLength.java 编译程序产生FileLength.class文件;
<2>jar -cvf test.jar FileLength.class 打包成test.jar文件,以下是运行结果:
added manifest
adding: FileLength.class(in = 506) (out= 373)(deflated 26%)
通过结果可以看出,系统自动帮你添加了manifest文件(这个文件的作用后面讲)。另外,jar命令的使用,自己参考参考网上jar命令的讲解。
<3>java -jar test.jar 运行test.jar文件 ;运行后出现以下错误:Failed to load Main-Class manifest attribute from test.jar,错误提示:找不到main-class
<4>解决办法:jar -xf test.jar 解压文件,你会发现你当前目录中多了个MENT-INF文件夹,进入该文件夹用vim打开MANIFEST.MF文件,文件内容如下:
Manifest-Version: 1.0
Created-By: 1.6.0_20 (Sun Microsystems Inc.)
现在你要做的就是,在文件中添加内容Main-class: FileLength (FileLength为main方法所在的文件)。这么做的目的是系统可以找到main-class。该文件的最终内容为:
Manifest-Version: 1.0
Created-By: 1.6.0_20 (Sun Microsystems Inc.)
Main-class: FileLength
<5>jar -cvfm test.jar MANIFEST.MF FileLength.class 重新打包
<6>java -jar test.jar 就可以运行成功了,试试看吧
理论基础:
JAR 文件就是 Java Archive File,顾名思意,它的应用是与 Java 息息相关的,是 Java 的一种文档格式。JAR 文件非常类似 ZIP 文件——准确的说,它就是 ZIP 文件,所以叫它文件包。JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。
举个例子,如果我们具有如下目录结构的一些文件:
|-- test
|-- Test.class
把它压缩成 ZIP 文件 test.zip,则这个 ZIP 文件的内部目录结构为:
test.zip
|-- test
|-- Test.class
如果我们使用 JDK 的 jar 命令把它打成 JAR 文件包 test.jar,则这个 JAR 文件的内部目录结构为:
test.jar
|-- META-INF
| -- MANIFEST.MF
|-- test
|--Test.class
MANIFEST.MF:打包清单。它是打包的关键性文件,主要是设置执行入口类和支持库的路径,在运行Java应用程序时要根据此文件中的内容来查找入口类和支持库。