自己打jar包时总是出这样那样的问题,网上也看了不少,有对的有错的,这次我自己总结了一点:
1.Mainfest.MF 文件
这是一个很规范的清单文件,主要说以下几点
①在Manifest-Version: ,Class-Path: ,Main-Class: , 后面都必须紧跟一个空格(基本都知道)
②每一行最多72个字符,对于mainfest-version行和main-class行基本不会超过,对于class-path就很难不超,这时就要换行写,最好的方式就是一行写一个jar包,换行写时就涉及到续行问题。多次试验证明,续行由2部分组成,上一行结尾的空格和下一行开始的空格,缺一不可。对于上图:2-11行的结尾都有一个空格,(12结尾没有);而3-12行的开头都有一个空格。缺少了下一行开始的空格,jar包生成不了,提示invalid
header field;缺少上一行结尾空格,虽然能生成jar,但是运行时找不到相应jar包。
对于续行,关键就是你本身是不是应该在一行,应该在但是由于72字符限制不能在的才续行,所以1,12,13 行结尾绝对不能有空格。
③关于main-fest,应该写的是 完整的包名 + 类名,不要加.java后缀。另外值得一提的是:. 分割还是 / 分割都行。com.venus.MainFrame 或com/venus/MainFrame(有人说必须/,本人以测,都行),
④lib后面的分割符只能是 / ,与平台无关。
⑤关于最后的空行,本人测的留一个空行,二个空行都可以,(有人说必须留2个)。
关于清单文件,大致就这么多
2.打jar包
我在打jar 包时一般都是最简的包(这里举个例子)
项目结构如下: 打包时的选择如下:
其中会去掉 ①库lib, ②项目的配置文件.classpath,.project,和 .fat.jar(这是一键打包工具留下的,不管它) ,③MANIFEST.MF,
而最后一步时,把清单文件加上
相应的,lib的库你需要在打的jar包的同一目录下,加上lib文件夹,里面放上你所需的依赖jar。
如下图结构:![]()
start.bat中只需写java -jar xlsToxls.jar 即可,无需再写任何依赖jar包的路径,其中的-jar参数, 是使系统的Classpath 变量不再起作用. 虚拟机将去MANIFEST.MF中的Class-Path 下找相关的包.
一定要有。
而打的jar包里面的结构如下
,没有任何冗余。
另外:有这样的bat写法:
start jdk1.8.0_60\bin\java -Dfile.encoding=UTF-8 -cp lib/commons-logging.jar;lib/fontbox-1.7.0.jar;lib/log4j-1.2.15.jar;lib/pdfbox-1.7.0.jar;lib/poi-3.7.jar com.venus.MainFrame
我觉得是这种不如上面的方法简洁,关键是没有任何冗余