为何打包(jar包)?为了项目的部署和发布,你的程序可能使用很多个类,把这些类和他们的目录一起压缩到一个文件中给别人,可以方便使用,通常在打包时候,会在里面加上部署的相关信息。打包实际上就是把代码和依赖的东西压缩在一起,变成后缀名为. jar包。
【jar命令和jar包(jar文件)
jar 命令(也称为jar工具)是随 JDK 安装的,在 JDK 安装目录下的 bin 目录中,Windows 下文件名为 jar.exe。可以使用jar命令创建、更新、提取和列出jar文件的内容。jar包(也称为jar文件),是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包,使用ZIP査看器(如WinZip)査看它。jar文件还包含META-INF目录,用于存储包和扩展配置数据,包括安全性版本控制、扩展和服务。
如果有很多.class文件(和其它文件),散落在各层目录中,肯定不便于管理。如果能把它们打一个jar包,变成一个文件,就方便多了。】
jar包和Manifest文件
jar包(文件)就是 Java Archive File(Java档案[归档]文件),是 Java 的一种文件格式,可将多个文件组合成一个文件。一个JAR文件由一系列采用Zip压缩格式的文件构成,同时还有一张“清单(Manifest)”,对所有这些文件进行了描述。JDK提供的许多类,也是以jar包的形式提供的。
jar包用于部署和封装库、组件和插件程序,并可被像编译器和 JVM 这样的工具直接使用。jar文件中有一个特定目录——META-INF,其中包含特殊的文件——MANIFEST.MF,用来定义扩展与档案打包相关数据信息,运行时向JVM提供应用程序的有关数据信息。
清单(Manifest)文件格式规则:
1.文件中的内容以键值对的形式出现,键值对之间采用"冒号和空格"进行分隔(注意:冒号后的空格必须有,不然格式有错误).
2.每行最多72个字符,换行继续必须以空格开头 。
3. Class-Path指定引用jar包的目录。调用多个jar时,每一个用空格(由一个或多个空格)隔开,不是逗号或分号,一行写不下(超过72个字符),从第二行开始,每行开头要至少一个空格。如:
Class-Path: lib/tools.jar lib/guava-r09.jar lib/guice-2.0.jar
lib/jakarta.commons.lang-2.2.jar
4. 文件的最后必需要空行,而且必须顶格。
更详细的说明,参考oracle提供的文档:http://docs.oracle.com/javase/1.5.0/docs/guide/jar/jar.html
一个简单的Manifest文件示例:
其中:
Manifest-Version
用来定义manifest文件的版本,例如:Manifest-Version: 1.0
Created-By
声明该文件的生成者,这行信息没什么用
Main-Class
定义jar文件的入口类,如果 JAR 文件被用作可执行的应用程序,那么应用程序需要告诉 Java 虚拟机入口点位置,任意包含 public static void main(String[] args) 方法的类即为入口点。该信息由文件头 Main-Class 提供,基本格式如下:
Main-Class: classname
classname值可由应用程序的入口点代替。
jar 命令介绍
当我们安装好JDK,设置好path路径,就可以正常使用jar.exe命令打包了。
在cmd中,可以使用jar --help 或 ar -h 获取详细信息。
JDK9之后引入了模块化的概念,所以JDK9之后jar命令有了比较大的变化,下面JDK11中的jar命令的用法:
作为对照了解,给出JDK8中jar命令如下图:
更详细的说明,参考oracle提供的文档(其中的数字为版本号):
https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jar.html#examples
https://docs.oracle.com/en/java/javase/11/tools/jar.html
https://docs.oracle.com/en/java/javase/12/docs/specs/man/jar.html
使用 jar 命令打包,事先必须编译好需要打jar的class。(eclipse一般在bin,maven构建的在target/classes)
例1、将当前目录所有的.class文件都打入 counter.jar包:
jar -cvf counter.jar *.class
例2、将 bin 目录中的所有文件打入 counter.jar包:
jar cvf counter.jar -C bin
例3、打包,把manifest文件插入JAR文件使用 m 选项,把指定文件名的manifest文件传入(这里是预先准备好的myapplication.mf ),用jar命令如下
jar cvfm myapplication.jar myapplication.mf -C classdir
将 -C classdir指定的路径下的全部内容,生成名为myapplication.jar的包,并将清单文件myapplication.mf的内容提取到META-INF/MANIFEST.MF文件中
打包成可运行的jar包,可直接通过命令“java -jar jar文件名”运行这个jar包
或 用记事本编写一个批处理文件(扩展名为bat),内容为:java -jar pigGame.jar
如想不显示(隐藏)黑窗口运行jar,批处理命令文件内容为:@start javaw -jar jar文件名运双击批处理文件即可运行jar文件了。
要打包成可运行的jar包,需要在MANIFEST.MF文件中使用Main-Class 指明 入口类(主类)。
附录
使用Eclipse导出向导生成jar包 可参见 https://blog.csdn.net/cnds123/article/details/80463293