对于初学者来说,使用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,储存在如下目录:
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.
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不存在,程序将自动创建之,在桌面上的结果,实际就是一个普通目录而已:
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,在任何位置输入命令:
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程序看似就是一小步,实际上其中包含有复杂的过程和逻辑,这些技术细节,需要在积累一定的实践经验和知识的基础上,再继续深究。