初学Java,在学习JAR压缩时,corejava教材中看似长篇大论,实讲没有讲清楚,这里作下笔记,说明实际使用中体会到的参数“cvfm” 和”cvfe”的区别:
两者主要区另在于”m”和”e”(m即先写好MANIFEST.MF文件,然后打包,e则是打包时指定主函数的类名,自动填入MANIFEST.MF中):

cvfm用法如:jar cvfm Myprogram.jar MANIFEST.MF *.class

  • Myprogram.jar 是你想压缩的jar包名
  • MANIFEST.MF 是人工按格式编写的manifest.mf类型清单文件,这里如果带有参数”m”,则列出的第一个的文件必须是name.mf(文件名随意,后缀为.mf即可),而且在此文中必须指明主程序所在的class文件及主程序的包路径(如果有包),假如主程序在包 examples下,则在MANIFEST.MF中必须写明: Main-class: examples.HelloWorld (注意冒号后有一个空格,包名和主类名根据自身情况修改)

jar cvfm jar cvfm命令_后缀


  • 否则在进行打包时会提示:invalid header field
    后面的*.class 则是要打包的文件,如果在一个文件夹中,如例子中就在examples文件夹中,则可以用 .\examples 进行打包。系统会直接将MANIFEST.MF 文件中内容复制到包中其中路径META-INF/MANIFEST.MF文件中。在生成的JAR压缩包中,被压缩的文件会放在examples文件夹中,即也会带上包路径进行复制和压缩。

完整过程:

  1. 写好*.MF文件,放入所要压缩成jar包的class文件夹下。该文件可以随意命名,后缀得是.MF,我命名的为test.MF。examples文件夹下为编译的HelloWorld.class文件,其实这里的examples就是包名。

jar cvfm jar cvfm命令_jar cvfm_02

  1. examples文件夹:


jar cvfm jar cvfm命令_后缀_03

  1. test.MF内容:

jar cvfm jar cvfm命令_文件名_04

  1. 打开cmd,进入当前目录下,输入 jar cvfm test.jar test.MF .\examples

jar cvfm jar cvfm命令_jar_05

  1. 压缩成功,进入文件夹查看,test.jar已存在

jar cvfm jar cvfm命令_jar cvfm_06

  1. 在cmd中运行test.jar。继续在当前目录下输入 java -jar test.jar

jar cvfm jar cvfm命令_后缀_07



运行成功!

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

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