这一章节开始JVM
的编写,首先解决第一个问题,就是如何运行java程序,回想最开始学java时,写一个Hello.java的程序,使用javac Hello.java
将源代码转换为class文件,然后使用java Hello
运行程序。JVM是只认class文件的,如果想让JVM运行该Hello程序,就要通过java命令。本节将介绍java命令的常用方法,并实现java命令的解析。最终通过命令参数,读取对应的class数据。
java 命令简介
Java
应用程序需要一个入口点,这个入口点就是我们熟知的main()
方法。如果一个类包含public static void main(String[] args)
方法,这个类就可以用来启动Java应用程序,我们把这个类叫作主类.这个类是需要我们用命令行手动向JVM提供的;
Java命令一般有以下几种形式:
java [-options] class [args]
java [-options] -jar jarfile [args]
javaw [-options] class [args]
javaw [-options] -jar jarfile [args]
- 可以向
java
命令传递三组参数:选项、主类名(或者JAR文件名)和 main() 方法参数。 - 选项由减号
-
开头。通常,第一个非选项参数给出主类的完全限定名(fully qualified class name)。 - 但是如果用户提供了
–jar
选项,第一个非选项参数表示JAR
文件名,java
命令必须从这个JAR文件中寻找主类。javaw
命令和java
命令几乎一样,唯一的差别在于,javaw
命令不显示命令行窗口,因此特别适合用于启动GUI
(图形用户界面)应用程序。
可以看到命令中都带有一个[-options]
代表可选项, java命令行常用选项如下:
选项 | 用途 |
---|---|
-version | 输出版本信息 |
-?/-help | 输出帮助信息 |
-cp/-classpath | 指定用户类路径 |
-Dproperty=value | 设置Java系统属性 |
-Xms |
设置初始堆空间大小 |
-Xmx |
设置最大堆空间大小 |
-Xss |
设置线程栈空间大小 |
当然,java命令行里提供的选项有很多,这里并不打算全部实现,只是挑几个比较重要的去实现.
接下来我打算实现以下几种命令:
java -version
java -help
java -cp your/classpath yourClassName arg1 arg2 ...
命令行解析功能编码
自己动手写相关的参数匹配解析 会导致代码不够优雅,而且不灵活,这里我直接使用了 commons-cli 工具来完成命令行解析的功能。
需要在pom 文件里面添加如下依赖
核心解析类 见 Main.java<dependency>
<groupId>commons-cli</groupId>
<artifactId>commons-cli</artifactId>
<version>1.2</version>
</dependency>
该类也是 我们的 jvm 的启动类。目前 该方法尚且不完善。需要 使用以下命令才能 读取到 class 文件
其实就是告诉我们的 程序我们的class 对象在什么地方。-cp jvmx/target/classes/ com.wangzhen.jvm.app