java、javac、javap指令应用

        在日常工作中,我们新建java工程,写好代码后,现在编译和运行几乎都是通过ide(如eclipse)工具完成。但作为java开发者还是要了解下java虚拟机指令。通过javac和java执行编译java文件和运行class以及jar文件。以windows系统为例解析javac和java指令的使用过程。

步骤一:通过eclipse新建java工程

步骤二:新建Java工程后,在src目录下新建jvm包

步骤三:在jvm包先新建HelloWord.java类,打印“Hello World!“,代码如下。我们这里需要注意的是这里需要注意HelloWorld类的package包名。

 

步骤三:通过javac指令对HelloWorld.class文件进行编译具体操作过程如下:

        1.打开cmd命令,输入javac指令,如果提示命令找不到,则需要配置java路径。具体配置过程参考以下连接: win10报错jar不是内部或外部命令,也不是可运行的程序_lvxiucai的博客-CSDN博客_jar不是内部或外部命令,也不是可运行的程序        如果比较懒不想配置也没关系,直接通过cd命令进入安装java路径的bin目录,在bin目录下执行javac命令,如图

        2.如果java路径已配置好,则可直接通过cd命令进入java代码所在目录,如图所示。其中javademo为工程名,jvm为包名。 

        3.当HelloWorld.java代码写好后,我们可以通过javac指令对java文件进行编译,生成class文件,如图。这里需要注意的是生成的class文件和java文件在同一目录下,如图。

 步骤四:java指令的使用

        1.如果直接在当前目录下执行java HelloWorld会提示找不到或无法加载主类,如图所示。但实际情况是HelloWorld.class文件在当前目录下是真是存在的。此时,如果我们直接进入到src目录下,再执行java jvm.HelloWorld就能正常执行(所以这里一定要注意包名)。

 

        2.如果java类是有多个,这个时候我们在打包的时候就需要将多个文件(不管是class文件或者是java文件)打成jar包,打jar包的命令即为jar命令。例如将HelloWorld.class打成一个jar包,然后再通过命令行的形式运行jar文件输出HelloWorld.        

        2.1.在打jar包的时候需要注意,不能在jvm目录下面执行,这里需要退到jvm的上级目录,在上级目录执行jar cvf hello.jar jvm执行,这样就可以将jvm目录下的所有文件一起打成一个jar包了。

        2.2打成jar包后,我们直接在src目录下执行java –jar hello.jar指令,这个时候是没办法直接运行jar包的,会出现jar包中没有主清单属性类型这样的报错信息。

         2.3.此时就需要我们手动维护jar包中的MANIFEST.MF文件,在MANIFEST.MF文件中维护好Main-class配置,配置信息如下,Main-class配置的是启动类,这里需要写好路径名称,如jvm.HelloWorld。配置修改后的MANIFEST.MF文件如下所示。再次执行java指令提示执行成功。

        2.4.由于MANIFEST.MF文件比较弱,所以在修改MANIFEST.MF的过程中,一定要注意空格。如果出现类似Error: Invalid or corrupt jarfile hello.jar这种错误如图所示。这种情况一般就是MANIFEST.MF文件的格式不对,常见的错误有该有空格的地方没有空格,不该有空格的地方出现空格了。一般修改过程是直接通过zip压缩工具打开jar包后,选中MANIFEST.MF文件,用记事本打开,修改后直接保存。这时候会自动将变化后的.MF文件会写到jar包中。

         3.class文件是由java文件经过java虚拟机编译后生成的指令集文件,如果想查看指令集详细信息可以通过javap -c HelloWorld.class或者javap -c -verbose HelloWorld.class指令查看。

        4. 如果需要查看class文件的二进制字节码信息,可以直接将class文件拖到sublime中打开,这里推荐一下sublime,感觉用户交互确实挺好。

 

 

 

 

相关文章

jinfo 命令可以用来查看 Java 进程运行的 JVM 参数,命令如下...
原文链接:https://www.cnblogs.com/niejunlei/p/5987611.ht...
java 语言, 开发者不能直接控制程序运行内存, 对象的创建都是...
jvm
1.jvm的简单抽象模型:  2.类加载机制     双亲委派模...
堆外内存JVM启动时分配的内存,称为堆内存,与之相对的,在代...
1.springboot和tomcat2.springcloud的请求如何通过网关鉴权?...