前面我们学习了 Java 字节码,写好的代码经过编译变成了字节码,并且可以打包成 Jar 文件。
然后就可以让 JVM 去加载需要的字节码,变成持久代/元数据区上的 Class 对象,接着才会执行我们的程序逻辑。
我们可以用 Java 命令指定主启动类,或者是 Jar 包,通过约定好的机制,JVM 就会自动去加载对应的字节码(可能是 class 文件,也可能是 Jar 包)。
我们知道 Jar 包打开后实际上就等价于一个文件夹,里面有很多 class 文件和资源文件,但是为了方便就打包成 zip 格式。 当然解压了之后照样可以直接用 java 命令来执行。
$ java Hello
或者把 Hello.class 和依赖的其他文件一起打包成 jar 文件:
示例 1: 将 class 文件和 java 源文件归档到一个名为 hello.jar 的档案中:
jar cvf hello.jar Hello.class Hello.java
示例 2: 归档的同时,通过e
选项指定 jar 的启动类Hello
:jar cvfe hello.jar Hello Hello.class Hello.java
然后通过 -jar
选项来执行jar包:
$ java -jar hello.jar
当然我们回过头来还可以把 jar 解压了,再用上面的 java 命令来运行。
运行 java 程序的第一步就是加载 class 文件/或输入流里面包含的字节码。
- 类的生命周期和加载过程
- 类加载时机
- 类加载机制
- 自定义类加载器示例
- 一些实用技巧
- 如何排查找不到 Jar 包的问题?
- 如何排查类的方法不一致的问题?
- 怎么看到加载了哪些类,以及加载顺序?
- 怎么调整或修改 ext 和本地加载路径?
- 怎么运行期加载额外的 jar 包或者 class 呢?