Java中的jar包的打包及导入
1 jar包
jar包(Java ARchive )是一种基本zip 格式的文件格式。目标是将java 生成的类文件、资源文件、管理文件等按照特定的结构打包成一个独立的文件,方便程序的发布或网络的下载。
package com.glp;
public class Hello {
public static void sayHello(String target) {
System.out.println("Hello " + target);
}
public static void main(String[] args) {
System.out.println("world");
}
}
将上述代码编译成Hello.class 文件,然后在cmd下使用jar cvf Hello.jar com\glp\Hello.class
压缩jar包。
jar包的目录结构:
MANIFEST.MF内容(简单描述了我们jar 包的版本和创建工具):
Manifest-Version: 1.0
Created-By: 9.0.1 (Oracle Corporation)
2 将jar 包转变为可执行程序入口
MANIFEST.MF 中我们只需要认识一个标签: Main-Class
,这个标签的含义是给出我们打包好的jar 文件中,哪个类是我们程序的入口类。
新建一个Manifest.txt
文件,并写入以下内容
Main-Class: com.glp.Hello
注意: 一定要在最后跟一个空行
还是在jar包所在目录下运行:
jar cvfm Runnable.jar Manifest.txt com\glp\Hello.class
运行结束后,得到了一个可执行jar包Runnable.jar
MANIFEST.MF内容更新为:
Manifest-Version: 1.0
Main-Class: com.glp.Hello
Created-By: 9.0.1 (Oracle Corporation)
运行Runnable.jar包:java -jar Runnable.jar
3 使用jar包中的类
将Hello.jar包放在Main类所在目录中。
package Test;
import com.glp.Hello;
public class Main {
public static void main(String[] args) {
Hello.sayHello("world");
}
}
尝试编译,报错:
这是因为我们的类放在jar 文件中,javac 编译器无法找到这个类文件,所以我们需要通过指定classpath 的方式,告诉编译器去哪里找到Main 类
如果没有包声明:
javac -classpath Hello.jar -encoding UTF-8 Main.java
因为Main.java中有包声明,所以需要打包编译或者跳到包目录的上级目录中进行编译:
javac -classpath Hello.jar -encoding UTF-8 -d . Main.java
参考博客:带有包声明的编译
运行时,报错:
这次是因为JVM找不到类,我们需要通过classpath 的配置方式,告诉JVM 我们的com.glp.Hello 类的位置。
如果没有包声明:
java -classpath "Hello.jar;." Main
因为有包声明:
java -classpath "Hello.jar;." Test.Main
导包编译时(有import com.glp.Hello时)执行流程是这样的:Main.java文件编译之后生成的字节码文件在当前目录(编译时他会寻找com.glp中是否有需要导入的Hello.class文件,若无,编译不通过,执行时,如果Main.java中没有包声明,java虚拟机首先会在当前目录找到Main.class就会执行. 如果有包声明,java虚拟机会去去包目录下寻找有没有Main.class字节码文件,如果找到了才能够成功执行。执行到程序中引用到Hello类的地方时,java虚拟机在当前目录查看是否有Hello.class字节码文件,即使发现了,也会根据源程序中的包导入进入包中寻找Hello.class,找到才能执行成功(其实在编译阶段就已经寻找了!).
参考博客:在Idea中进行jar包的打包及导入