Java制作jar包的几种方法

来源:互联网 发布:axure rp中文版 mac 编辑:程序博客网 时间:2024/06/05 05:26

一、操作零散的单个或几个class文件

[plain] view plaincopyprint?
  1. jar cvf ibstool.jar com/cn/ibs/TurnD.class com/cn/ibs/TurnB.class  

二、把一个文件夹下面的所有class文件打成jar包

[plain] view plaincopyprint?
  1. jar cvf ibstool.jar * (回车)  

三、生成可执行jar包:

编译的class文件中必须有main入口函数的类方能生成可执行jar包,如:

[plain] view plaincopyprint?
  1. public static void main(String[] args)  

生成的方法步骤:

方法一:

1.用上面的方法把class与相应的结构目录打成jar包

2.解压这个jar包到当前目录

3.编辑META-INF/MANIFEST.MF,给jar包指定程序入口main函数,内容为:

[plain] view plaincopyprint?
  1. Manifest-Version: 1.0  
  2. Created-By: 1.5.0_06 (Sun Microsystems Inc.)  
  3. Main-Class: MutiThread (回车)  

(注意回车与空格,这个文件的内容排版必须标准)

4.再用winzip把这些文件压缩成jar格式包,或者压成zip包,再改后缀名为jar也可。

方法二:
1. 打成可执行的jar包
cmd操作窗体中进入class文件的根目录,之所以说根目录,是因为下面其下面还可以有很多文件包(夹);
在此目录准备好一个manifest.mf文件,其内容为:

[plain] view plaincopyprint?
  1. Manifest-Version: 1.0  
  2. Created-By: 1.5.0_06 (Sun Microsystems Inc.)  
  3. Main-Class: MainEntry  
main-class为指定所有类的main方法所在的类名.

最后用命令: jar cvfm jarname.jar manifest.mf *

2.测试可执行jar包.
执行命令:

[plain] view plaincopyprint?
  1. java -jar jarname.jar  

3.为可执行jar包制作bat文件.
例如 :

[plain] view plaincopyprint?
  1. @echo off  
  2. rem  
  3. rem Set BQ_IBS_HOME before running this script.  
  4. rem  
  5. if not "%BQ_IBS_HOME%" == "" goto CONT0  
  6. set BQ_IBS_HOME=c:\ibs  
  7. :CONT0  
  8. @echo on  
  9. java -DBQ_IBS_HOME=%BQ_IBS_HOME% -jar jarname.jar  
  10. :END  

------------------------------------------------------------------------------------------------

jar包中MANIFEST.MF的写法

对于通常的MANIFEST.MF文件,一般格式是:

[plain] view plaincopyprint?
  1. Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar  
在一行之内将所有的jar包路径写上,空格分隔即可。

但是对于一些大型的项目,因为依赖包众多,比如大于30个,那么如果还写在一行内,就会出现一个长度惊人的行。程序运行倒不会有任何问题,但是对于版本控制就很不友好,如增加或者减少一个依赖包,这行就会被改写。以后对比不同版本时,只能知道这行被修改了确无法直接知道是做了什么修改,必须通过其他方式才能对比出来。

同样的问题发生在code merge(代码整合)时,如果两个分支都修改了这个文件,就必须通过手工来进行merge,而且要对照出来彼此到底改了什么,很困难而且容易出错。 

因此一个改进就是将这个文件中的依赖按照一行一个依赖的方式重写,这样以后修改时只会修改改依赖所在的行,很容易就对比出来具体做了哪些感动,code merge时版本控制软件一般也很容易直接自动merge成功。

    修改后的文件类似如下:

[plain] view plaincopyprint?
  1. Class-Path: lib/a.jar  
  2.     lib/b.jar  
  3.     lib/c.jar  
  4.     lib/d.jar  
  5.     lib/e.jar  
  6.     lib/f.jar  

    但是在实际操作时发生了意料之外的问题,会出现异常或者类无法找到,经检查发现问题出现在MANIFEST.MF的格式上,MANIFEST.MF对于分行和空格是有特殊要求的:

1. 每行的最后一个jar的名称后不容许有空格

    即"    lib/b.jar"在b.jar后必须回车结束本行,不能有空格,一个都不能

2. 每行的开头必须有不少于2个空格

    即"    lib/b.jar"在b.jar前必须有不下两个空格

3.最后一行要回车换行,但不能有空格

    以上三个条件有一个不满足都会出现问题,有点古怪。

4、严格的MANIFEST.MF格式

    在实际的操作中一定要严格的按照格式的要求进行书写,否则给文件将无法使用


方法三:(在eclipse中导出项目为可执行jar包)


如果自己的java project中需要引用额外的jar包作为资源文件,那么需要自己自定义配置文件MANIFEST.MF ,内容示例如下:

Manifest-Version: 1.0
Class-Path: lib/crimson.jar lib/jbcl.jar lib/junit.jar lib/log4j-1.2.13.jar lib/mysql-connector-java-3.1.13-bin.jar
Main-Class: src.YourMainClassName

其中的Class-Paht就指定了外来jar包的位置。请注意假设我们的项目打包后为project.jar,那么按照上面的定义,应该在 project.jar的同层目录下建立一个lib文件夹,并将相关的jar包放在里面。否则将会出现Exception in thread "main" java.lang.NoClassDefFoundError的错误。

最后介绍一下使用Eclipse制作jar包的过程吧:

1. 首先在Eclipse中打开项目, 右键点击项目,选择“Export”;

2. 选择Java/JAR file,Next;

3. Select the resources to export中可以选择你想要包含的项目文件夹,一些不必要的文件夹就无需放进去了,免得增大空间;

这里有几个选项:

    * Export generated class files and resources 表示只导出生成的.class文件和其他资源文件
    * Export all output folders for checked projects 表示导出选中项目的所有文件夹
    * Export java source file and resouces 表示导出的jar包中将包含你的源代码*.java,如果你不想泄漏源代码,那么就不要选这项了
    * Export refactorings for checked projects 把一些重构的信息文件也包含进去

在Select the export destination中选择导出的jar的路径,Next

4. 下一页可以选择是否导出那些含有警告warning或者错误errors的*.class文件。一般不用理他,Next

5. 下一个页面里可以对项目做一些配置。

    * Generate the manifest file是系统帮我们自动生成MANIFEST.MF文件,如果你的项目没有引用其他class-path,那可以选择这一项。
    * Use existing mainfest from workspace。这是可以选择我们自定义的.MF文件,格式如上所写。
    * Seal content。要封装整个jar或者指定的包packet
    * Main class。这里可以选择你的程序入口,将来打包出来的jar就是你这个入口类的执行结果。

最后Finish,搞定。


转载自:       http://blog.csdn.net/andy_yf/article/details/7338223

                     http://blog.csdn.net/xzknet/article/details/3505505

              

                  

0 0