这个Java命令行工具是个什么意思呢?
其实就是在cmd里面输入java -version,然后会给你返回结果,这样一个东西
我们接下来就是要实现这样一个的类似功能,用Java实现,也就是,在cmd输入myjava -version,输出一些东西。
当然,这个我不当做重点,只是简单实现,我把重点放在JVM内存结构那几块。
首先我们来分析下,java -version,有哪些动作
一:执行java.exe
二:执行的同时传入-version 这个参数
没错!就是这么简单,那么,怎么证明步骤一呢?
可以通过where命令,
输入java,windows就会根据你的环境变量里的Path参数,去寻找对应的java.exe,你可以试下,把你的windows下这些路径的java.exe都换个名字,再看看输入java会不会是找不到可执行文件。
那么,要实现我们的myjava -version,输入myjava的时候,其实也就是去寻找myjava.exe了
然后,我们看看步骤二,怎么获取-verseion这个参数。
因为我们是用Java开发的这个命令行工具,所以启动这个工具的时候必定要有个入口点,这个入口点就是main()方法,参数我们可以通过main()方法中的args参数去获取。
可能我描述的并不好,没关系,我们先看代码,看过之后你就大概知道了。
这是我的项目结构图
Main.java
package com.ziyu.jvm;
import com.ziyu.jvm.ch01.Args;
/**
* @ClassName main
* @Date
* @Author
* @Description TODO
**/
public class Main {
public static void main(String[] args){
Args.paseArgs(args);
}
}
Args.java
package com.ziyu.jvm.ch01;
/**
* @ClassName Args
* @Date
* @Author
* @Description TODO
**/
public class Args {
private static final String ARGS_VERSION = "-version";
private static final String ARGS_HELP = "-help";
private static final String ARGS_VERBOSE = "-verbose";
private static final String ARGS_CP = "-cp";
public static void paseArgs(String... args) {
if (args.length == 0) {
System.out.println("Hello!");
return;
}
if (ARGS_VERSION.equals(args[0])) {
System.out.println("myjvm version is no version");
}
}
}
接着我们把项目maven install打成jar包
然后我们在命令行中运行
java -jar target\my-jvm-1.0-SNAPSHOT.jar -version
如果你运行之后提示的是“XX.jar中没有主清单属性”的话,那么可以在pom中添加如下参数
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
这是因为java -jar命令实际上是去jar包中查找 META-INF\MANIFEST.MF文件
并且从“Start-Class”参数中读取启动的方法,之所以会提示“XX.jar中没有主清单属性”,是因为没有“Start-Class”这个参数。
OK,到这其实已经做的差不多了,还差个把启动方式从
java -jar target\my-jvm-1.0-SNAPSHOT.jar
变成输入myjvm。
怎么实现呢?
可以把my-jvm-1.0-SNAPSHOT.jar这个jar包转换成myjvm.exe文件,然后在命令行中运行再带上参数-version就可以了。
具体我就不实现了,因为不做重点,思路就是这样,大家可以自行实现。
如果对文章有什么意见,可以在下方留言。
内容参考自《自己动手写Java虚拟机》