一、什么是jar包
JAR(Java ARchive,Java 存档)是一种与平台无关的文件格式,可将多个文件合成一个文件。JAR 文件格式以流行的 ZIP 文件格式为基础,JAR 文件与 ZIP 文件唯一的区别就是在 JAR 文件的内容中,包含了一个 META-INF/MANIFEST.MF 文件,这个文件是在生成 JAR 文件的时候自动创建的。里面包含了该Jar包的版本、创建人、类搜索路径Class-Path等信息,如果是可执行Jar包,会包含Main-Class属性,表明Main方法入口。
jar包主要是对java编译生成的class文件进行打包,所以是平台无关的, jar包是可跨平台的。除了.MF以及.class文件之外,jar还能打包静态资源文件如.html、.css以及.js等项目所需的一切,这也就意味着咱们能将自己的项目打成jar,即不管是web应用还是底层框架,都能打成jar包。
二、JAR 文件用处
当我们开发了一个程序以后,程序中有很多的类,如果需要提供给别人使用,发给对方一大堆源文件是非常不好的,因此通常需要把这些类以及相关的资源文件打包成一个 jar 包,把这个 jar 包提供给别人使用,同时提供给使用者清晰的文档。这样他人在拿到我们提供的jar之后,就能方便地进行调用,让jar包的调用看起来如黑盒。
- 用于发布和使用类库
- 作为应用程序和扩展的构建单元
- 作为组件、applet 或者插件程序的部署单位
- 用于打包与组件相关联的辅助资源
三、创建可执行 JAR
制作只含有字节码文件的jar包
- 最简单的一个类的jar包
1、写一个Hello.java的文件,Java文件中不要带上所在的包package那一行代码
2、用命令行进入到该目录下,编译这个文件成.class
3、将编译后的Hello.class文件打成jar包
-c表示要创建一个新的jar包
-v表示创建的过程中在控制台输出创建过程的一些信息
-f表示给生成的jar包命名
4、运行jar包,需要添加Main-Class属性
用压缩软件打开hello.jar,会发现里面多了一个META-INF文件夹,里面有MENIFEST.MF的文件,打开在第三行的位置写入 Main-Class: Hello (冒号后面有一个空格,整个文件最后有一行空行),保存运行 java -jar hello.jar ,此时成功在控制台看到 hello
- 含有多个类的jar,类之间存在调用关系
1、用记事本写一个Hello.java和一个Tom.java的文件
public class Hello {
public static void main(String[] args) {
Tom.speak();
}
}
public class Tom {
public static void speak(){
System.out.println("hello");
}
}
2、编译: javac Hello.java
Hello.java和Tom.java同时被编译,因为Hello调用Tom,在编译Hello的过程中发现还需要编译Tom
3、、打成jar包
准备好上述的MANIFEST.MF文件,并存放在META-INF文件夹下,然后打jar包
该命令表示用第一个文件当做MENIFEST.MF文件,hello.jar作为名称,将Hello.class和Tom.class打成jar包。参数m,表示要定义MENIFEST文件
4、运行 java -jar hello.jar
- 有目录结构的jar包
1、 将Tom这个类放在com下
2、Tom.java需要在第一行声明自己的包名
3、Hello.java第一行进行import引入Tom这个类
4、编译Hello.java
5、准备好MENIFEST文件,打包jar包
jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class com
最后一个com表示把com这个文件夹下的所有文件都打进jar包
6、运行 java -jar hello.jar ,此时成功在控制台看到 hello
7、com包下有Tom.java源文件的,也被打进jar包,优化一下javac命令,使所有的编译后文件编译到另一个地方
在编译Hello.java时,先新建一个target文件夹
javac Hello.java -d target
将所有编译后的文件,都放到target文件夹下
将META-INF文件夹也复制到target目录下,进入这个目录
jar -cvfm hello.jar META-INF\MANIFEST.MF *
最后一个位置变成了*,表示把当前目录下所有文件都打在jar包里
- 总结
制作一个只含有class字节码文件的jar包
javac 要编译的文件 -d 目标位置
jar -cvfm 命名 MENIFEST文件 要打包的文件1 要打包的文件2
制作含有jar文件的jar包
- 两个jar包间相互调用
1、 生成tom.jar
2、 将Hello.java并将其编译成Hello.class,Hello里面引用了Tom类的方法,因此在打jar包时应使用-cp参数,将tom.jar包引入
javac -cp tom.jar Hello.java
-cp 表示 -classpath,指的是把tom.jar加入classpath路径下
3、将hello.class打成jar包
jar -cvfm hello.jar META-INF\MANIFEST.MF Hello.class
引入jar包需要在MENIFEST.MF文件中配置一个新属性:Class-Path,路径指向你需要的所有jar包,运行 java -jar
4、总结
引入多个jar包,中间用空格隔开
javac -cp xxx.jar 要编译的文件 -d 目标位置
jar -cvfm 命名 MENIFEST文件 要打包的文件1 要打包的文件2