研究了一会怎么用jar命令直接打包可执行jar,写篇文章做个笔记。有人看就当是博客没人看就当笔记了。
其实主要步骤是配置MANIFEST.MF,MANIFEST.MF在META-INF文件夹里。
这里给个例子,在本工程了有一个可执行class(就是有main方法)learninggui.viplugincracker.Cracker,四个依赖库文件appFramework-1.0.jar,commons-codec-1.6.jar,jnlp.jar,licensechecker.jar
我们可以通过Eclipse生成的jar文件研究一下MAINFEST.MF怎么写
在Eclipse的Package Explorer邮件单击点export选Runnable JAR file,next
Launch Configuration选择启动的class;
方法一、
Library handling 第一个是把所需要的jar库全部解压到 jar文件的根目录,如果我们用压缩文件解压会看到这样的文件层次
这种方式生成的MANIFEST.MF文件内容如下
Manifest-Version: 1.0
Class-Path: .
Main-Class: learninggui.viplugincracker.Cracker
这里需要注意的是冒号后面要有一个空格(经过试验发现多个空格也是可以的)不然会出现下图的错误
Mainfest-Version是版本号,Class-Path是和CLASSPATH作用一样的,Main-Class就是可运行jar必须的,指定了jar运行时启动的class。因为Class-Path是一个点也就是jar里面的根目录,所以依赖的class文件都可以找到。
于是我们就可以自己依葫芦画瓢了,把所需要的库文件都就压到要打包的文件夹里然后在该文件夹新建META-INF文件夹再在META-INF文件夹新建MANIFEST.MF,内容依上面的实例改写。
然后用jar命令打包
cd 到要打包的jar文件夹,输入以下命令:
jar cvfm a.jar META-INF/MANIFEST.MF .
参数c是指创建归档,v是verbose(啰嗦的意思)指显示详细输出,f是指定文件 不然不能指定输出文件a.jar,最后的m就是指包含MANIFEST.MF的清单信息对应参数META-INF/MANIFEST.MF 注意最后还有一个参数是个点是指从当前目录创建归档。
方法二、
Manifest-Version: 1.0
Rsrc-Class-Path: ./ jnlp.jar appFramework-1.0.jar licensechecker.jar c
ommons-codec-1.6.jar
Class-Path: .
Rsrc-Main-Class: learninggui.viplugincracker.Cracker
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
这里多了两个变量Rsrc-Class-Path和Rsrc-Main-Class,而且Main-Class也已经不是我们正真的class:
learninggui.viplugincracker.Cracker了。看Main-Class的包名就知道了是Eclipse的class加载器(不知道是不是重载的ClassLoader)。这么说Rsrc-Class-Path和Resr-Main-Class应该是Eclipse的class 加载器所需要的变量。不过从这个文件我们可以看出来Class-Path的不同值之间是用一个空格来间隔开的。不知道Eclipse是出于什么原因要加入自己的Class加载器。但是我们自己打包的时候肯定不会再去找Eclipse的这些东西,于是我们试着自己打包。把编译好的文件复制到工作目录下,新建一个lib目录来存放以来的jar文件,把所有依赖的jar拷贝到lib目录
Mainfest-Version: 1.0
Class-Path: . ./lib/appFramework-1.0.jar ./lib/commons-codec-1.6.jar ./jnlp.jar ./licensechecker.jar
Main-Class: learninggui.viplugincracker.Cracker
jar cfm a.jar META-INF/MAINFEST.MF .
打包之后双击运行~嗯~feels good~
方法三、
Manifest-Version: 1.0
Class-Path: . 4_lib/jnlp.jar 4_lib/appFramework-1.0.jar 4_lib/licensec
hecker.jar 4_lib/commons-codec-1.6.jar
Main-Class: learninggui.viplugincracker.Cracker
经过上面几个MANIFEST.MF的研究这个不用说就很明了了。具体做法依旧不赘述了。