java -jar some.jar

执行 java -jar some.jar 后发生了什么?

一般而已,一个 jar 包,其实的本质就一个 zip 包,是一堆 class 文件的集合,class 文件按照它们的包名分布在各个文件夹中的。

JVM 被设计成只有一个使命:按照类的全限定名字,加载、执行类。

全限定名 - Fully Qualified Name 就是包含了包名的类的名字,例如:com.company.Application

这样 JVM 就可以根据全限定名顺藤摸瓜找到类的 class 文件,然后加载执行。

JVM 是如何找到 class 文件的呢?

是通过 -classpath 的参数指定了 class 文件所在的目录

230248

通过 -classpath 设置的不是一个目录,而是一串目录,jar 包也可以看成是一个目录,目录和目录之间使用冒号 : 分隔

JVM 和 JVM 的包管理机制非常简单:

我们需要做的,就是把 JVM 所需要的字节码完整、正确的给到 classpath。

完整 - 意思是任何时候 JVM 都不会抱怨找不到某个类(NoClassDefFoundError)

正确 - 意思是给到 classpath 的字节码的版本是正确的(NoSuchMethodError)

当执行完 java -jar some.jar 后,会发生什么呢?

000653

jdk 自带的 AppClassLoader 只能加载只包含 class 文件的 jar,那 jar in jar 如果加载呢,就需要自定义 classloader 了

Java包管理的那些事1

Java包管理的那些事2

Java包管理的那些事3

Java包管理的那些事4

执行Java -jar somefile.jar时发生了什么一

执行Java -jar somefile.jar时发生了什么二