JAVAC和JAVA命令的使用

来源:互联网 发布:网络公开课观后感 编辑:程序博客网 时间:2024/06/08 03:49
配置好JAVA开发基础环境后,就可以进行基本的JAVA开发了。目前最便捷高效的开发工具当属Eclipse,它能有效的组织开发项目,自动完成部分代码输入,并有强大的纠错和调试功能。但对初学者来说,一开始就使用Eclipse进行JAVA开发,无法形成对JAVA编译和运行过程的整体认识,对JAVA程序结构、错误调试缺少基础的排查处理能力,因此,建议初学者还是先使用记事本编写JAVA程序,使用传统的命令行窗口进行编译和运行。
传统方式使用最多的就是JAVAC和JAVA命令,其中JAVAC命令将.java源文件编译成可执行的.class文件,JAVA命令可以运行.class文件。
在进行基础开发之前,最好先进行开发目录的规划工作,这样能做到各类文件存放有序,结构合理。我的JAVA学习目录为D:\java\study,与JAVA学习有关的内容全放在该目录下。study目录下又新建了sources、classes、jars等目录 ,其中sources存放JAVA源文件,classes目录存放编译后的.class文件,jars目录存放压缩后的jar包。规划好目录后就可以进行JAVA开发了。
一、编写JAVA源文件
我们先用记事本编写两个JAVA程序,一个在包中,一个不在包中,将其保存在sources目录中。不在包中的代码如下:

保存后,再编写第二个在包中的:

二、编译和运行不在包中的HelloWorld

首先打开命令行窗口,进入到sources目录,可以看到刚才编写好的HelloWorld.java源文件,这时使用:javac HelloWorld.java命令会在当前目录下生成HelloWorld.class类文件,如果此时直接运行java HelloWorld是可以运行成功的。

但是如果想将class类文件直接生成在classes目录中,这样需要在JAVAC命令中使用-d参数,该参数指定编译后的类文件的存放目录。因此,需要使用:

javac -d ../classes HelloWorld.java

这样就可以将HelloWorld.class文件直接生成在classes目录下了。


此时在sources目录下运行java HelloWorld有几种情况:

一种是classes目录已经在当前环境的classpath变量中进行了配置,那么系统会到该目录中查找,找到HelloWorld.class后就能正常运行。

另一种情况 ,classes目录不在classpath变量中,那么系统在classpath变量所包含的所有目录中查找完后,也没有找到HelloWorld.class文件,那么就会出现“找不到或无法加载主类 HelloWorld”的错误提示。这时可以修改classpath变量值,添加classes目录,如果不想修改classpath变量值,可以在java命令中使用-classpath(-cp)参数来设置临时变量:

java -cp ../classes HelloWorld即可运行。


三、编译和运行在包中的HelloWorldInPackage

使用包可以有效的避免不人员开发的类因同名而产生冲突,同时还可以更好的组织和规划多个类之间的逻辑关系。

我们先按照在包中的方法进行编译,即在sources目录下使用:

javac HelloWorldInPackage.java命令,编译后可以看到在sources目录下生成了HelloWorldInPackage.class文件,这时继续在该目录下运行该文件:

java HelloWorldInPackage,这时系统会出现”找不到或无法加载主类HelloWorldInPackage“的错误提示。

为什么会运行不成功呢?因为该JAVA程序处于包中,包名为net.csdn.blog.antcsq

与没有使用包的程序有两点不同之处:

一是在使用java运行时必须使用类的全名,即在类名前增加包名,因此HelloWorldInPakcage.class的全名就变成了net.csdn.blog.antcsq.HelloWorldInPackage.class

二是在包中的类必须位于与包名对应的目录结构中,该HelloWorldInPackage.class必须位于net/csdn/blog/antcsq这样的目录结构中。

那么现在我们已经生成了HelloWorldInPackage.class文件,它在sources目录中,没有放置在相对应的目录结构中,因此现在可以依次在sources目录中新建net/csdn/blog/antcsq目录结构,并将HelloWorldInPackage.class移动至antcsq目录中。这时我们再在sources目录下运行刚才的命令:java HelloWorldInPackage,还是出现同样的错误提示,仍然找不到类,因此该命令中只使用了类名,没有使用全名。我们再使用如下命令:

java net.csdn.blog.antcsq.HelloWorldInPackage

可以看到运行成功了。


但是这样运行包中的类,每次都要进行如此繁琐的操作,不仅效率低下,还容易出错。因此我们可以修改javac和java命令,使其自动生成包结构:

因此,在sources目录下编译时,可使用-d参数,一旦使用了-d参数,javac命令会自动在参数指定的目录下自动生成包结构:

javac -d ../classes HelloWorldInPackage.java

编译后我们看到classes目录下生成了net目录,再往下看依次生成了csdn、blog、antcsq目录,在antcsq目录中生成了HelloWorldInPackage.class文件。这时运行

java -cp ../classes net.csdn.blog.antcsq.HelloWorldInPackage可成功运行。

如果想在当前目录下生成包结构,-d参数后必须加 ”.“代表当前目录:

javac -d . HelloWorldInPackage.java注意-d和”.“之间要有一个空格。


四、使用JAVAC有几点需要注意:

一是-d参数可放在编译文件之前,也可放置在后面,如下面的语句也可以:

javac HelloWorld.java -d ../classes

二是-d参数的路径分隔符可以使用/,也可以使用\

三是-d参数的路径名中可以出现中文目录

三是如果源代码文件不在当前目录下,可在文件前加上路径,如当前目录是F盘,要编译刚才的HelloWorld.java,可以使用如下命令:

javac -d d:/java/study/classes   d:/java/study/sources/HelloWorld.java

四是路径名中如果有空格,必须将整个路径名用英文双引号"引起来,如:

javac -d "../classes/my class" "e:/javasources/my src/HelloWorld.java"

五是使用-d参数时,指定的目录必须存在,否则会报错,如:

javac -d e:/errdir HelloWorld.java,如果e盘下没有errdir目录,javac命令不会自动生成该目录,只会报错

六是javac命令不区分大小写,如下命令也可运行:

javac -d ../ClasseS heLLowOrld.java

七是如果类在包中,javac中-d参数或者classpath变量值中的类路径指向的最终路径,应该是该类的包的顶极目录,如对于net.csdn.blog.antcsq.HelloWorldInPackage类,它虽然存放在classes/net/csdn/blog/antcsq这样的多级目录下,但它的类路径仍是在classes下面,即-d参数和classpath类路径应指向d:/java/study/classes即可,如果指向antcsq目录,而该目录下又没有net/csdn/blog/antcsq这样的包结构,则会运行失败。


五、使用JAVA命令有几点要注意:

一是-cp参数只能放在运行的类前,下面的命令会报错:java HelloWorld -cp ../classes

二是-cp参数时可以使用相对路径,如前所示,也可以使用绝对路径:

java -cp d:/java/study/classes HelloWorld

三是-cp参数中的路径分隔符可以使用/,也可以使用\

四是-cp参数中如果有多个路径,其间用”;“分隔。

0 0
原创粉丝点击