关于java jar相关的理解说明

原文章的代码引用:https://www.cnblogs.com/YZFHKMS-X/p/11840281.html

  代码1:
  **public class Main{
public static void main(String ... args){
    System.out.println("hello world");
}

}**
代码2:
public class Say{
public static void say(String str){
System.out.println("This is " + str);
}
}

代码3:
public class Main{
public static void main(String … args){
System.out.println(“hello world”);
Say.say(“Charles”);
}
}

第一步:
当执行 下面的命令时
jar cvf Main.jar Main.class
会创建 Main.jar 文件。
其中
jar xf Main.jar META/MANIFEST.MF 解压的时候:
1,f : 此参数可以指定 META/MAINFEST.MF,
一般是省略META/MAINFEST.MF这个后面的格式的
2,然而通过 java -jar Main.jar 执行的时候,会报错!
原因是Main.jar 的打包文件的META目录下的MAINFEST.MF文件中没有Main-Class: Main 这段指向 Main.class 类
META-INF/MANIFEST 的清单文件中!
Manifest-Version: 1.0
Created-By:1.8.0_151 (Oracle Corporation)
Main-Class: Main – 后面需要进行回车
完成上述操作以后,可以在当前目录下的文件删除,只剩下Main.class文件跟META-INF目录
然后执行
jar cMf Main.jar ,意思是:不创建META-INF/MANIFEST.MF文件,因为已经存在了!
所以进行推断出 jar 打包,需要有META-INF 跟 Main.class等一样的类文件。这样就不用指定m 这个参数来创建META-INF/MANIFEST.MF了
也就是说 Main.jar 包里包含了 META-INF 跟 Main.class等一样的类文件组成!

第二步:
当当前目录下没有META-INF目录时,但是有MANIFEST.MF目录,且是已经将 Main-Class : Main 写入到MANIFEST.MF文件中后 !
目录下剩余 MANIFEST.MF Main.class两个文件,执行下面的文件
jar cmf MANIFEST.MF Main.jar Main.class
所以推断出 , m小写的参数: m 是需要创建META-INF文件,并将生成的MANIFEST.MF移到META-INF文件下!

第三步:为jar 包指定清单文件
当前目录下存在的 文件有:
MANIFEST.MF Main.class Main.jar 三个文件
其中:MANIFEST.MF文件中已经有了 Main-Class: Main 写入到MANAFEST.MF文件中后
其中 Main.jar 是通过jar cvf Main.jar Main.class命令生存的原始清单文件
命令如下:
jar umf MANIFEST.MF Main.jar

      如果是通过 jar  cMf进行更改的话:
      
      由于 M 参数是不进行创建META-INF文件的,所以在当前目录下需要的文件是:META-INF/MANIFEST.MF
      所以命令:
      jar uMf META-INF/MANIFEST.MF Main.jar

注意:其中M参数与小m参数的说明:是自己容易理解而如此认为。
因为在第四步的时候,不容易解释。但是,这么理解也没有问题

第四步:为多个class的类文件打包
目录下文件下只包含: ./META-INF/MANIFEST.MF
Main.java – 代码二
Say.java 三个文件

       通过 javac *.java 将所有的java文件进行编译成.class的文件
       : Main.class   Say.class

       然后通过:
        jar cmf META-INF/MANIFEST.MF Main.jar Main.class Say.class
       或者 :
        jar cmf META-INF/MANIFEST.MF Main.jar *.class
        
        其中注意: 三个 参数 c m f ,其中m f 的命令参数说明。
                 如果小m的参数在f之前: 则META-INF/MANIFEST.MF 在 Main.jar这个打包文件名之后!
                 如果小m的参数在f之后:则META-INF/MANIFEST.MF 在 Main.jar这个打包文件名之前!
        如下的写法:
        jar -cfm Main.jar META-INF/MANIFEST.MF  Main.class Say.class
        如果是如下情况则报错:
        jar -cmf  Main.jar  META-INF/MANIFEST.MF  Main.class Say.class
        报错如下:java.io.FileNotFoundException: Main.jar(没有那个文件或目录)!

:自动生成META-INF/MANIFEST.MF的方法 使用小e参数,语法如下:

jar cvfe jarname. jar mainclassname *. class

 解释:jarname. jar表示打包的jar文件名      mainclassname表示的是要指定的Main-Class: Main       ,不可在后面加上. class 但是可以加上包名加类名,但是不要加后缀. class                                                                                           

*.class 表示要被打包的JAVA编译文件

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值