进行JAR压缩时,参数“cvfm" 和"cvfe"的区别

来源:互联网 发布:淘宝客怎么赚佣金 编辑:程序博客网 时间:2024/06/18 17:47

初学java,在学习JAR压缩时,corejava教材中看似长篇大论,实讲没有讲清楚,这里作下笔记,说明实际使用中体会到的参数“cvfm" 和"cvfe"的区别:

两者主要区另在于"m"和"e":

cvfm用法如:jar cvfm Myprogram.jarResource.mf *.class *.gif *.txt

其中Resource.mf  是人工按格式编写的manifest.mf类型清单文件,这里如果带有参数"m",则列出的第一个的文件必须是Resource.mf(文件名随意,后缀为.mf即可) ,而且在此文中必须指明主程序ResourceTest.class及主程序的包路径(如果有包),假如主程序在"package resource;"下,则在Resource.mf 中必须写明:Main-class:resource/ResourceTest(此处不能带.class)

否则在进行打包时会提示:invalid header field,按照本例情况,正确指令应该是:

jar cvfm Myprogram.jarresource/Resource.mf resource/*.classresource/*.gif *resource/.txt

系统会直接将Resource.mf 文件中内容复制到打包中其中路径META-INF/manifest.mf文件中。

最后在生成的JAR压缩包中,被压缩的文件会放在resource文件夹中,即也会带上包路径进行复制和压缩。

另外:如果在resource中还想把Resource.mf文件也压进去,则在指令最后还要再加上resource/Resource.mf即可。

格式为:jar cvfm Myprogram.jarresource/Resource.mf resource/*.class resource/*.gif *resource/.txt resource/Resource.mf

 

cvfe用法如:jar cvfe Myprogram.jarresource/ResourceTest   *.class *.gif *.txt

这种情况下,e代表会根据第一个文件名(必须为主程序的文件名,不带.class后缀),此例中为resource/ResourceTest   则系统会自动在打包中创建META-INF/manifest.mf文件并把Main-class:resource/ResourceTest复制进去,这个路径如果填得不对,那么复制进去的路径就是错的,导致压缩成功后再执行时,会无反应。

 

 

总结:参数m是采用复制自编的 .mf文件内容的形式,参数e则是采用复制指令中的主程序文件名的形式,如果主程序在package中,对不管哪种参数,对应的包路径都要带齐。两个参数,只是实现形式不一样,但目的都是为了把主程序入口信息放入META-INF/manifest.mf文件中,另META-INF/manifest.mf文件是在JAR打包过程中,系统自己创建的目录,文件manifest.mf中专门用来存放主程序入口信息及其他文件清单信息,打包完成后,在执行打包文件时,系统会读取META-INF/manifest.mf文件中的主程序入口信息,根据主程序名.class进行响应,如果一开始给的主程序入口信息是错误的,那么即使打包成功了,在后续执行打包文件时也会无响应或是无法访问。

1 0
原创粉丝点击