对于初学者来说,使用CMD命令(Unix以及类Unix系统采用Termial)来编译和运行Java的好处是让初学者直观地体会到编译(Compile)这一步骤,加深记忆。所谓编译就是将文本文件xxx.java翻译为Java虚拟机可以识别的字节码文件xxx.class,这部分原理暂且不做深究,直接介绍如何使用CMD命令执行Java程序。Unix/Linux或者Mac iOS等其它类Unix系统,方法都一样,涉及到的一些操作CLASSPATH的命令与Windows系统不同,就此不再赘述。

写一个Hello World程序



1 public class HelloWorld {
2     public static void main(String[] args){
3         System.out.println("Hello, World!");
4     }
5 }



因为规定java文本文件名称,必须与文件中public的类名相同,所以,我保存上述代码文件名为HelloWorld.java,储存在如下目录:

cmd javac编译java文件 使用cmd编译java文件_操作系统

1.编译



E:\myJava\javaSrc>javac HelloWorld.java -d .



命令解析:

完整命令: javac [ options ] [ sourcefiles ] [ classes] [ @argfiles ]

  • javac: java语言的编译器,使用命令行编译Java源文件,输出字节码文件.class.
  • sourcefiles: java源文件的相对路径。
  • options: 这里使用的是-d, 即directory简写,表示输出字节码的位置,"."表示当前目录,".."表示上级目录,"..\bin"表示在当前目录的兄弟目录bin,以此类推。

所以HelloWorld.java编译完成后在当前目录输出了字节吗文件HelloWorld.class.

cmd javac编译java文件 使用cmd编译java文件_Java_02

 



2.运行



E:\myJava\javaSrc>java HelloWorld
Hello, World!



java运行程序的命令是:

java [options] classname [args]

  • java: 执行程序命令。执行顺序是启动JRE->加载class->调用class的main()方法,main方法必须是public static void main(String[] args)的样子。
  • classname: 要执行的class文件的名称,要加包名,中间以'.'隔开,比如java.lang.String
  • options: 一些可选参数[可参考Java文档]

成功打印出字符串: Hello, World!



 

将class输出到指定package

  package简言之就是存放Java字节码文件的包,jar文件就是存放package的包,这样区分文件结构,使项目的层次更分明,便于维护,可以避免命名重复的问题,注意要在类声明上方声明package:



1 package hello;     //声明package
2 
3 public class HelloWorld {
4     public static void main(String[] args){
5         System.out.println("Hello, World!");
6     }
7 }



1.编译



E:\myJava\javaSrc>javac HelloWorld.java -d ..



注意存放路径是".."即上级目录,它表示"hello"这个package的生成路径,class文件会生成在hello包中,如果hello不存在,程序将自动创建之,在桌面上的结果,实际就是一个普通目录而已:

cmd javac编译java文件 使用cmd编译java文件_java_03



2.运行



java运行程序的命令是:



E:\myJava\javaSrc>java ../hello.HelloWorld
错误:找不到或无法加载主类



 结果却是提示找不到class,如果我们现在将CMD打开到hello包所在同级目录下,即"myJava"目录,运行:



E:\myJava>java hello.HelloWorld
Hello,World!



 程序成功输出了,也就是java解释器定位到了class文件。其实,java的解释器只能找到当前路径下和CLASSPATH变量存储路径中的包,所以我必须先把CMD的路径切换到hello的同级目录下,然后再运行java hello.HelloWorld。

    那么如果每次都这样执行,岂不是很麻烦?

 

CLASSPATH



       "The class path is the path that the Java Runtime Environment (JRE) searches for classes and other resource files."----官方文档, 即CLASSPATH就是JRE寻找class文件和其它资源文件的地方,因此,为了方便运行,就有必要把我们生成的包想办法放到CLASSPATH变量中,WIn7环境下的操作方法         是:

  右击“计算机”->属性->高级系统设置->环境变量->系统变量, 双击“CLASSPATH”, 在“变量值”最后输入";路径",其中";"是多个CLASSPATH的分隔符号,如图所示:

      

cmd javac编译java文件 使用cmd编译java文件_操作系统_04

 

 好了,设置完成后,重新打开CMD,在任何位置输入命令:



C:\Windows>java hello.HelloWorld
Hello,World!



   都可以成功运行啦!



   当然,java命令中亦可以显式地使用-classpath参数告诉JRE去哪里找,不过这种方式的作用域是一次命令,也可以用命令行

  set classpath=%classpath%;dir        //dir是你需要设置的绝对路径

  在本CMD窗口打开的期间生效一个临时的CLASSPATH,其它的CMD窗口不生效(Linux 使用#export CLASSPATH=$CLASSPATH:dir )。你可以使用

  set classpath

 来查看当前生效的CLASSPATH中有没有你设置的路径(Linux使用echo $classpath查看)。

 

总结

  • 启动一个Java应用程序,需要经过编译和运行两个过程;
  • 编译就是将程序员编写的Java源文件翻译为Java虚拟机可执行的字节码文件;
  • 运行字节码文件的前提是虚拟机通过JRE的环境变量CLASSPATH找到这些文件;
  • 可以设置CLASSPATH变量来将你的目录加入到环境变量中以使JRE能找到字节码文件;
  • 找到文件后虚拟机将会加载字节码文件以运行。

  不积跬步,无以至千里,不积小流,无以成江海。运行一个Java程序看似就是一小步,实际上其中包含有复杂的过程和逻辑,这些技术细节,需要在积累一定的实践经验和知识的基础上,再继续深究。