我们经常会见到jar文件,有些可以直接运行,例如windows下双击jar文件、Linux下使用 " java -jar *.jar "命令, 均能运行jar文件,
而有些jar文件却不能双击运行或者使用上述命令运行时提示没有Main。其中的原因和jar文件生成办法有关,只有生成jar文件时指定了Main方法所在类的才能直接运行。
下面介绍常用的两种生成jar文件方法:
(1) 生成jar时指定入口类
例如有如下程序:
[root@localhost javaTest]# ls <Test.java是包含main方法的入口类>
Test.java Test.class
首先,创建一个manifest.mf文件,并添加相关内容,指定入口类.
[root@localhost javaTest]# vim manifest.mf
Main-Class:<空格>Test<回车>
一定要注意:空格和回车: Main-Class: Test
打包:
[root@localhost javaTest]# jar cvfm x.jar manifest.mf *.class
打包时需要将class文件打包,当然也可以选择其它文件.
运行:
[root@localhost javaTest]# java -jar javaTest.jar
因为指定了入口类,所以这样运行时会直接运行jar文件中的Test类.
查看jar文件中的内容:
使用 " jar xvf *.jar " 解压jar文件到当前目录下
zkl@hadoopvm01:~/java/Hello> jar xvf x.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
inflated: Test.class
zkl@hadoopvm01:~/java/Hello> ls
Test.class x.jar META-INF
zkl@hadoopvm01:~/java/Hello> ls META-INF/
MANIFEST.MF
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
Main-Class: Test
我们可以看到有个META-INF/MANIFEST.MF文件,manifest.mf文件的内容在打包时会写入到该文件当中。
运行jar文件时,也会读取该文件,找到入口类.
(2) 生成jar时不指定入口类
同样是上面的程序, 首先打包:
[root@localhost javaTest]# jar cvf x.jar *.class
运行:
由于没有指定入口类, "java -jar x.jar" 命令会出现如下错误:
Failed to load Main-Class manifest attribute from x.jar。
我们解压 x.jar 文件,查看MANIFEST.MF内容
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
发现于(1)比,少了一行,这就是原因所在。此时需要按如下方式运行jar文件。
zkl@hadoopvm01:~/java/A> java -classpath x.jar Test
这样运行时,java会在classpath中搜索Test类,这里会在x.jar中搜多到Test,然后运行。
附:
(3) jar 命令复杂打包
外部库路径: lib
源码路径: src, 有很多包
class文件所在路径: bin
而有些jar文件却不能双击运行或者使用上述命令运行时提示没有Main。其中的原因和jar文件生成办法有关,只有生成jar文件时指定了Main方法所在类的才能直接运行。
下面介绍常用的两种生成jar文件方法:
(1) 生成jar时指定入口类
例如有如下程序:
[root@localhost javaTest]# ls <Test.java是包含main方法的入口类>
Test.java Test.class
首先,创建一个manifest.mf文件,并添加相关内容,指定入口类.
[root@localhost javaTest]# vim manifest.mf
Main-Class:<空格>Test<回车>
一定要注意:空格和回车: Main-Class: Test
打包:
[root@localhost javaTest]# jar cvfm x.jar manifest.mf *.class
打包时需要将class文件打包,当然也可以选择其它文件.
运行:
[root@localhost javaTest]# java -jar javaTest.jar
因为指定了入口类,所以这样运行时会直接运行jar文件中的Test类.
查看jar文件中的内容:
使用 " jar xvf *.jar " 解压jar文件到当前目录下
zkl@hadoopvm01:~/java/Hello> jar xvf x.jar
created: META-INF/
inflated: META-INF/MANIFEST.MF
inflated: Test.class
zkl@hadoopvm01:~/java/Hello> ls
Test.class x.jar META-INF
zkl@hadoopvm01:~/java/Hello> ls META-INF/
MANIFEST.MF
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
Main-Class: Test
我们可以看到有个META-INF/MANIFEST.MF文件,manifest.mf文件的内容在打包时会写入到该文件当中。
运行jar文件时,也会读取该文件,找到入口类.
(2) 生成jar时不指定入口类
同样是上面的程序, 首先打包:
[root@localhost javaTest]# jar cvf x.jar *.class
运行:
由于没有指定入口类, "java -jar x.jar" 命令会出现如下错误:
Failed to load Main-Class manifest attribute from x.jar。
我们解压 x.jar 文件,查看MANIFEST.MF内容
zkl@hadoopvm01:~/java/Hello> cat META-INF/MANIFEST.MF
Manifest-Version: 1.0
Created-By: 1.6.0_17 (Sun Microsystems Inc.)
发现于(1)比,少了一行,这就是原因所在。此时需要按如下方式运行jar文件。
zkl@hadoopvm01:~/java/A> java -classpath x.jar Test
这样运行时,java会在classpath中搜索Test类,这里会在x.jar中搜多到Test,然后运行。
附:
(3) jar 命令复杂打包
外部库路径: lib
源码路径: src, 有很多包
class文件所在路径: bin