关于jar包中MANIFEST.MF写法
例如我们打包的jar为 Test.jar
Manifest-Version: 1.0
Main-Class: windows.VideoWindow
体育节加油稿
Class-Path: lip.swt_3.3.0.v3346.jar lip.swt.win32.win32.x86_3.3.0.v3346.jar
上⾯为打包为jar中的包说明⽂件. 下⾯这个报错⼀直出现.
could not find main class. Program will exit
这个错误提⽰其实不是没有发现main class. ⽽是jar如果有错误执⾏不了,就会出现这个错误. 打包完成后, 要先运⾏ cmd -> java -jar your.jar 确认没有问题即可执⾏jar. 使⽤-jar参数后, 系统的Classpath 变量不再起作⽤. 虚拟机将去MANIFEST.MF中的Class-Path 下找相关的包.
张金鹏
然后才能成功的从: windows.VideoWindow 的main⽅法进⼊. 否则没有相关连接包,则会提⽰找不到main class. ⽽⼤家可能还迷糊的找不到北. 明明有main class吗.
描写建筑物的成语如果这个写的不对. 则就会⼀直报错.
看看上⾯这个Class-Path: 后⾯的写法. 空格分开. 绝对不能有分号.切记.
最后必须有换⾏. 这个也是要注意的. 否则依然提⽰没有mainclass.
不要因为这个⼩事情耽误了时间. 其中 lib/ 表⽰这个jar必须在打包Test.jar所在⽬录的⼀个lib⼦⽬录中.
运⾏jar需要命令: java -jar Test.jar
双击也可以, 则使⽤ javaw 打开.
关于java -classpath a.jar;b.jar; class test.Test 执⾏时. a.jar;b.jar; 后⾯都必须有分号. 否则报错. 不要指望不写classpath让系统⾃⼰找.这不是在eclip⾥⾯.必须写上你要使⽤的类. 否则总会提⽰您编译出错.
2、MANIFEST.MF ⽂件中奇怪的分⾏和空格要求
⼯作中发现的⼀个⾮常奇怪也很有趣事情,有关MANIFEST.MF⽂件中的分⾏和空格的格式要求,分享给⼤家。
小猫钓鱼怎么玩
对于通常的MANIFEST.MF⽂件,⼀般格式是:
Class-Path: lib/a.jar lib/b.jar lib/c.jar lib/d.jar lib/e.jar lib/f.jar
在⼀⾏之内将所有的jar包路径写上,空格分隔即可。
离合器的作用是什么
但是对于⼀些⼤型的项⽬,因为依赖包众多,⽐如⼤于30个,那么如果还写在⼀⾏内,就会出现⼀个长度惊⼈的⾏。程序运⾏倒不会有任何问题,但是对于版本控制就很不友好,如增加或者减少⼀个依赖包,这⾏就会被改写。以后compare不同版本时,只能知道这⾏被修改了确⽆法直接知道是做了什么修改,必须通过其他⽅式才能对⽐出来。
同样的问题发⽣在code merge时,如果两个分⽀都修改了这个⽂件,就必须通过⼿⼯来进⾏merge,⽽且要对照出来彼此到底改了什么,很困难⽽且容易出错。
翅尖
因此⼀个改进就是将这个⽂件中的依赖按照⼀⾏⼀个依赖的⽅式重写,这样以后修改时只会修改改依赖所在的⾏,很容易就对⽐出来具体做了哪些感动,code merge时版本控制软件⼀般也很容易直接⾃动merge成功。
修改后的⽂件类似如下:
Class-Path: lib/a.jar
lib/b.jar
lib/c.jar
lib/d.jar
大豆卵磷脂胶囊lib/e.jar
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格式
今天才发现这个⽂件的格式要求⽐较严格,因为使⽤的包⽐较多,所以那个Class-path的内容就⽐较多,我全部放在了⼀⾏,结果服务器启动读取那个⽂件的时候报错,错误信息是⾏太长,把它们切成多⾏,结果⼜是⽆效的头字段(java.io.IOException: invalid header field),和⼯程⾥⾯的其它⽂件⽐较了下,发现换⾏后要在前⾯加⼀个空格,后来⼜发现明明包含了⼀个包,但是找不到类,⼜在每⾏的后⾯加了⼀个空格,这下才完全搞定。