随笔 - 117  文章 - 72  trackbacks - 0

声明:原创作品(标有[原]字样)转载时请注明出处,谢谢。

常用链接

常用设置
常用软件
常用命令
 

订阅

订阅

留言簿(7)

随笔分类(130)

随笔档案(123)

搜索

  •  

积分与排名

  • 积分 - 152571
  • 排名 - 390

最新评论

[标题]:[原]手动打包JAR为可执行文件
[时间]:2012-02-13
[摘要]:打包JAR的步骤、JAR包内部的资源访问以及MANIFEST.MF文件格式注意事项。
[关键字]: Java、package、打包、Jar、manifest、可执行文件
[文章编号]:暂无
[环境]: JDK 7.0
[作者]: wintys  (wintys@gmail.com)

[正文]:
0、背景
    尽管IDE自动打包JAR的功能已经很强大,但是手动打包JAR的步骤和注意事项也得心知肚明。对于简单的示例程序,使用手动打包也很方便。

1、打包JAR
    1.1 建立清单文件
    以下内容为文件内容   
    清单文件MANIFEST.MF(在D:\test\class目录下):
    ==================
    Manifest-Version: 1.0   
    Main-Class: a(主类的路径,此选项可选,如果希望在windows下双击就执行,必须写)   
    Created-By: 1.7.0_02 (Oracle Corporation)(随便写,这个是创建人名字)   
    ==================   

    1.2 打包   
    在D:\test\class\目录下执行   
    jar cvfm classes.jar MANIFEST.MF *.*   

    以上命令将class下所有文件打包到classes.jar,生成在class目录下。   

    1.3 执行   
    输入java -jar classes.jar执行  或   双击classes.jar即可。

    1.4 另一种方案   
    如果希望使用非JAR工具建立JAR文件, 建议使用WinRAR。首先还是需要建立一个清单文件(名字必须为MANIFEST.MF), 向此文件中写入同使用JAR 工具时一样的内容, 接着需要建立一个META-INF子目录, 然后将 MANIFEST.MF放入此目录, 接着就可以保持目录结构将所有这些内容使用 WinRAR 压缩为 ZIP 格式的文件,文件名取为 xxx.jar 即可。

2、需要注意的相关问题
2.1 JAR中的资源访问
    程序的资源文件(如*.gif, *.jpg, *.jpeg, *.properties 等等)不能使用物理路径, 只能使用相对于当前类文件的相对资源路径, 只有这样才能保证打包以后程序才能找到这些资源文件. 那么, 这些文件在打开的时候都要使用下列语句:
    URL url = getClass().getResource(String name);
    或者
    InputStream in = getClass().getResourceAsStream(String name);

    例如:
    URL url = getClass().getResource("loading.gif");
    ImageIcon icon = new ImageIcon(url);
    其它的资源文件的使用也与此相似. 不过属性文件(*.properties)的使用, Java 自动会加载 JAR 文件中的属性文件, 例如:
ResourceBundle.getBundle("com.abc.test");
那么, 这个文件只要放在 JAR 文件目录结构下的 com/abc/test.properties, Java 就能自动找到这个文件.

2.2 清单文件的格式
MANIFEST.MF内容示例(添加JAR库文件,在Class-Path指明路径):
    Manifest-Version: 1.0   
    Class-Path: lib/commons-codec-1.4.jar lib/commons-logging-1.1.1.jar li
     b/httpclient-4.1.3.jar lib/httpclient-cache-4.1.3.jar lib/httpcore-4.
     1.4.jar lib/httpmime-4.1.3.jar    
    Created-By: 1.7.0_02 (Oracle Corporation)
    Main-Class: MyLogin

    a.清单文件文件条目的冒号后有一个空格。
    b.清单文件总是以Manifest-Version属性开头
    c.每行最长72个字符,如果超过,采用续行。(手动写MANIFEST.MF时不受此限,用JAR.exe生成JAR包时会自动断行。)
    d.确认每行都以回车结束,否则改行将会被忽略。
    e.如果Class-Path 中的存在路径,使用"/"分隔目录,与平台无关。
    f.Class-Path中的jar包之间用空格分隔,而非分号。
    g.如果库不打包入JAR,写成:Class-Path: ./lib/jacob.jar ./lib/jdom.jar ./lib/log4j.jar

[参考资料]:
    [1]*《命令行用JAR打包CALSS文件,很简单》: http://www.diybl.com/course/3_program/java/javajs/20090407/164482.html
    [2] 《打包程序为 JAR 可执行文件》 : http://www.moon-soft.com/doc/25438.htm
    [3] 《打jar把第三方的jar也打进去》 : http://www.blogjava.net/soddabao/archive/2007/01/08/92455.html
    [4] 《Jar命令 Manifest.mf的用法》 : http://ganqing.iteye.com/blog/1138341
    [5] 《关于 jar包中MANIFEST.MF 写法 》 : http://blog.csdn.net/happyhell/article/details/6639792
    [6]*《JAR File Specification》(Oracle) : http://docs.oracle.com/javase/1.3/docs/guide/jar/jar.html#The%20META-INF%20directory
原创作品,转载请务必保持原文完整性并注明出处。
作者:wintys (wintys@gmail.com)
博客:http://www.blogjava.net/wintys
posted on 2012-02-13 20:35 天堂露珠 阅读(1262) 评论(0)  编辑  收藏 所属分类: Java

只有注册用户登录后才能发表评论。


网站导航: