打JAR包那些事

什么是JAR文件

  • JAR包就是Java Archive File,是Java的一种文档格式。JAR包与ZIP文件非常类似——本质上来说,它就是ZIP文件。JAR文件与ZIP文件唯一的区别就是,在JAR文件中包含了一个META-INF/MANIFEST.MF,这个文件是在生成JAR文件的时候自动生成的。
如何打JAR包
  • 在JVM中实际解析的是.class字节码而非.java文件,且JAR包中一般不建议包含代码源文件。所以,打JAR包的过程实际就将.class文件打包。
    编译
  • 首先,新建一个test.java文件,里面写下helloworld的java代码。
    class test { public static void main(String[] agrs) { System.out.println("hello world!"); } }

  • 然后,执行javac命令编译test.java。
    javac test.java -d build

  • 以上命令表示,将test.java编译后的.class文件,放到build文件夹下。后面就可以去build文件夹中打JAR包。
    修改MANIFEST.MF
  • 【打JAR包那些事】进入build文件夹后,首先需要执行下面命令来创建MANIFEST.MF文件。
    jar -cvf test.jar test.class

  • 以上命令中c表示要创建一个新的JAR包,v表示创建的过程中在控制台输出创建过程的一些信息,f表示给创建的JAR包命名
  • 用解压软件打开test.jar,会发现包里有一个META-INF文件夹,文件夹里有MENIFEST.MF的文件,用记事本打开,其内容可能是:
    Manifest-Version: 1.0 Created-By: 11 (Oracle Corporation)

  • 此时的JAR包是无法被执行的,因为不知道那个main函数需要被执行。所以我们加上Main-Class来指定需要执行的main函数。需要注意的是:1、Main-Class需要指定的main函数所在类的全路径名,2、冒号之后一定要跟英文的空格,3、整个文件最后有一行空行)。修改后的完整文件如下:
    Manifest-Version: 1.0 Created-By: 11 (Oracle Corporation) Main-Class: test

    打包
  • 这时执行如下命令就可以打出可以直接执行的JAR包了。
    jar -cvfm test.jar META-INF/MANIFEST.MF test.class

  • 其中增加的参数m表示要定义MANIFEST.MF文件。
    执行
  • 最后执行如下命令就能在控制台中打印hello world!了。
    java -jar test.jar

    推荐阅读