java 将应用程序打成可执行的JAR包,然后使用批处理方式运行

时间:2022-01-10 15:42:30

1. jar 命令详解

jar 是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe,Linux 下文件名为 jar。它的运行需要用到 JDK 安装目录下 lib 目录中的 tools.jar 文件。不过我们除了安装 JDK 什么也不需要做,因为 SUN 已经帮我们做好了。我们甚至不需要将 tools.jar 放到 CLASSPATH 中。


使用不带任何的 jar 命令我们可以看到 jar 命令的用法如下:


jar {ctxu}[vfm0M] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...


其中 {ctxu} 是 jar 命令的子命令,每次 jar 命令只能包含 ctxu 中的一个,它们分别表示:


 -c 创建新的 JAR 文件包


 -t 列出 JAR 文件包的内容列表


 -x 展开 JAR 文件包的指定文件或者所有文件


 -u 更新已存在的 JAR 文件包 (添加文件到 JAR 文件包中)


 [vfm0M] 中的选项可以任选,也可以不选,它们是 jar 命令的选项参数


 -v 生成详细报告并打印到标准输出


 -f 指定 JAR 文件名,通常这个参数是必须的


 -m 指定需要包含的 MANIFEST 清单文件


 -0 只存储,不压缩,这样产生的 JAR 文件包会比不用该参数产生的体积大,但速度更快


 -M 不产生所有项的清单(MANIFEST〕文件,此参数会忽略 -m 参数


 [jar-文件] 即需要生成、查看、更新或者解开的 JAR 文件包,它是 -f 参数的附属参数


 [manifest-文件] 即 MANIFEST 清单文件,它是 -m 参数的附属参数


 [-C 目录] 表示转到指定目录下去执行这个 jar 命令的操作。它相当于先使用 cd 命令转该目录下再执行不带 -C 参数的 jar 命令,它只能在创建和更新 JAR 文件包的时候可用。


文件名 ... 指定一个文件/目录列表,这些文件/目录就是要添加到 JAR 文件包中的文件/目录。如果指定了目录,那么 jar 命令打包的时候会自动把该目录中的所有文件和子目录打入包中。


下面举一些例子来说明 jar 命令的用法:


1) jar cf test.jar test


该命令没有执行过程的显示,执行结果是在当前目录生成了 test.jar 文件。如果当前目录已经存在 test.jar,那么该文件将被覆盖。


2) jar cvf test.jar test


该命令与上例中的结果相同,但是由于 v 参数的作用,显示出了打包过程,如下:


标明清单(manifest)


增加:test/(读入= 0) (写出= 0)(存储了 0%)


增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)


3) jar cvfM test.jar test


该命令与 2) 结果类似,但在生成的 test.jar 中没有包含 META-INF/MANIFEST 文件,打包过程的信息也略有差别:


增加:test/(读入= 0) (写出= 0)(存储了 0%)


增加:test/Test.class(读入= 7) (写出= 6)(压缩了 14%)


4) jar cvfm test.jar manifest.mf test


运行结果与 2) 相似,显示信息也相同,只是生成 JAR 包中的 META-INF/MANIFEST 内容不同,是包含了 manifest.mf 的内容


5) jar tf test.jar


在 test.jar 已经存在的情况下,可以查看 test.jar 中的内容,如对于 2) 和 3) 生成的 test.jar 分别应该此命令,结果如下;


对于 2)


META-INF/


META-INF/MANIFEST.MF


test/


test/Test.class


对于 3)


test/


test/Test.class


6) jar tvf test.jar


除显示 5) 中显示的内容外,还包括包内文件的详细信息,如:


0 Wed Jun 19 15:39:06 GMT 2002 META-INF/


86 Wed Jun 19 15:39:06 GMT 2002 META-INF/MANIFEST.MF


0 Wed Jun 19 15:33:04 GMT 2002 test/


7 Wed Jun 19 15:33:04 GMT 2002 test/Test.class


7) jar xf test.jar


解开 test.jar 到当前目录,不显示任何信息,对于 2) 生成的 test.jar,解开后的目录结构如下:


==


|-- META-INF


|  `-- MANIFEST


`-- test


`--Test.class


jar xvf test.jar


运行结果与 7) 相同,对于解压过程有详细信息显示,如:


创建:META-INF/


展开:META-INF/MANIFEST.MF


创建:test/


展开:test/Test.class


9) jar uf test.jar manifest.mf


在 test.jar 中添加了文件 manifest.mf,此使用 jar tf 来查看 test.jar 可以发现 test.jar 中比原来多了一个 manifest。这里顺便提一下,如果使用 -m 参数并指定 manifest.mf 文件,那么 manifest.mf 是作为清单文件 MANIFEST 来使用的,它的内容会被添加到 MANIFEST 中;但是,如果作为一般文件添加到 JAR 文件包中,它跟一般文件无异。


10) jar uvf test.jar manifest.mf


与 9) 结果相同,同时有详细信息显示,如:


增加:manifest.mf(读入= 17) (写出= 19)(压缩了 -11%)


2. 关于 JAR 文件包的一些技巧


1) 使用 unzip 来解压 JAR 文件


在介绍 JAR 文件的时候就已经说过了,JAR 文件实际上就是 ZIP 文件,所以可以使用常见的一些解压 ZIP 文件的工具来解压 JAR 文件,如 Windows 下的 WinZip、WinRAR 等和 Linux 下的 unzip 等。使用 WinZip 和 WinRAR 等来解压是因为它们解压比较直观,方便。而使用 unzip,则是因为它解压时可以使用 -d 参数指定目标目录。


在解压一个 JAR 文件的时候是不能使用 jar 的 -C 参数来指定解压的目标的,因为 -C 参数只在创建或者更新包的时候可用。那么需要将文件解压到某个指定目录下的时候就需要先将这具 JAR 文件拷贝到目标目录下,再进行解压,比较麻烦。如果使用 unzip,就不需要这么麻烦了,只需要指定一个 -d 参数即可。如:


unzip test.jar -d dest/


2) 使用 WinZip 或者 WinRAR 等工具创建 JAR 文件


上面提到 JAR 文件就是包含了 META-INF/MANIFEST 的 ZIP 文件,所以,只需要使用 WinZip、WinRAR 等工具创建所需要 ZIP 压缩包,再往这个 ZIP 压缩包中添加一个包含 MANIFEST 文件的 META-INF 目录即可。对于使用 jar 命令的 -m 参数指定清单文件的情况,只需要将这个 MANIFEST 按需要修改即可。


3) 使用 jar 命令创建 ZIP 文件


有些 Linux 下提供了 unzip 命令,但没有 zip 命令,所以需要可以对 ZIP 文件进行解压,即不能创建 ZIP 文件。如要创建一个 ZIP 文件,使用带 -M 参数的 jar 命令即可,因为 -M 参数表示制作 JAR 包的时候不添加 MANIFEST 清单,那么只需要在指定目标 JAR 文件的地方将 .jar 扩展名改为 .zip 扩展名,创建的就是一个不折不扣的 ZIP 文件了,如将上一节的第 3) 个例子略作改动:


jar cvfM test.zip test



[size=3]如何打jar包和运行jar包[/size]

[size=3]首先,例如c盘根目录下有类HelloWorld.java:
public class HelloWorld{
      public static void main(String[] args){
          System.out.println("Hi, Hello World!");
      }
}[/size]
[size=3]把HelloWorld.java打jar包并运行:
1。进入cmd中
2。cd .. 到c盘根目录
3。运行一下java类:javac HelloWorld.java[/size]
[size=3]
4。相同目录下建一个h.mf文件,内容如下:[/size]
[size=3]         Manifest-Version: 1.0
         Main-Class: HelloWorld
         Created-By: 1.2.2(sun Microsystems Inc.):[/size]
[size=3]       其中HelloWorld为要打包的类名。[/size]
[size=3]
5。在cmd中执行:[/size]
[size=3]       jar cfm hello.jar h.mf *.class
       其中hello为打成jar包的名称(或者cvfm)[/size]
[size=3]
6。java -jar hello.jar 即可运行。


3.jar文件打包
假设需要打包的文件如下:
classes/com/albertsong/MyApp.class
classes/com/albertsong/Aaaa.class
classes/com/albertsong/util/Bbbb.class
(其中MyApp包含main函数)
建一个mymanifest.mf 文件,内容如下:
Main-Class: com.albertsong.MyApp


建一个myjar.bat文件,内容如下:
set JAVA_HOME=C:/jsdk1.5.0_09
set PATH=%JAVA_HOME%/bin
set CLASSPATH=%JAVA_HOME%/lib/tools.jar;
jar cvfm MyApp.jar mymanifest.mf  -C classes .

这两个文件都放到和classes同一个目录,即目录结构象下面一样
MyApp/classes/com/albertsong/MyApp.class
MyApp/classes/com/albertsong/Aaaa.class
MyApp/classes/com/albertsong/util/Bbbb.class
MyApp/mymanifest.mf
MyApp/myjar.bat
然后点myjar.bat这个文件执行就可以了:)

4.执行jar文件
建一个目录MyApp/release。
将生成的MyApp.jar复制到这个目录。
在这个目录里新建一个批处理文件run.bat,内容如下:
set JAVA_HOME=C:/jsdk1.5.0_09
set PATH=%JAVA_HOME%/bin
set CLASSPATH=%JAVA_HOME%/lib/tools.jar;
javaw -jar MyApp.jar

5.其它
   1)jar cvfm MyApp.jar mymanifest.mf  -C classes .
      这行命令,最后的.一定不能掉,jar命令给出的帮助的例子是
       jar cvfm classes.jar mymanifest -C foo/ .
      但是在windows下应该改成
      jar cvfm classes.jar mymanifest -C foo/ .
      或者
     jar cvfm classes.jar mymanifest -C foo .
   2)如果应用程序比较大,可能会用到其它的库,这时可以在release目录下建一个lib
     然后在run.bat的CLASSPATH中添加用到的库。
   set CLASSPATH=%JAVA_HOME%/lib/tools.jar;lib/ccc.jar;lib/ddd.jar;
    3)如果要指定java程序使用的内存,这样
    javaw -ms100m -mx256m -jar MyApp.jar
    上面指定了使用最小100M最大256M内存。
    4)如果main函数要带参数
    javaw -ms100m -mx256m -jar MyApp.jar  arg1 arg2
    5)如果不能在控制台看到有关信息,可以用java来执行jar包
      java -ms100m -mx256m -jar MyApp.jar  arg1 arg2
     javaw在后台执行。
    6)如果bat文件一闪而过,看不到输出,可以在文件最后一行加上pause,最好的是通过cmd.exe来运行run.bat