前言:
今天一个不会java的朋友也不知道从哪整了一个java文件让我帮忙运行一下,我就直接把这个.java文件复制到桌面然后打开cmd命令行工具,第一步(javac + java文件的绝对路径)编译好使,第二步(java + class文件的绝对路径)就不好使,如:
一开始还真把我给整懵逼了,我以前记得都好使啊,还以为是我的java或者变量啥的有问题了,折腾了半天还是那样,后来发现以前都是切换到.java文件的目录下执行这些命令,这次是第一次输入绝对路径报的错,后来根据这个思路去网上搜了下发现自己基础知识不牢固真是汗颜啊。
解决:
方法一:编译的时候最好用-d参数(后面可加点或者绝对路径),如:javac f:/java/8000/example.java -d .(这个命令可以确保你的class文件会生成在你的当前操作目录下或你想要的路径下),然后进入-d参数后面的路径下你就可以直接执行命令java example
方法二:运行java命令的时候加-cp参数(后面加class文件的路径,和-classpath参数一样,是它的缩写),如:java -cp C:\Users\Administrator\Desktop helloworld
方法三:你要是不乐意,就在classpath的最前边加上你想加的任何目录,这样java程序就会从你设置的第一个路径开始找指定的文件,找不到再去从你设置的第二个路径开始找,如:.;C:\Users\Administrator\Desktop;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar。不管你把class文件放在桌面还是C:\Users\Administrator目录下,你运行java helloworld都可以打印出Hello world
JAVA_HOME、CLASSPATH、PATH详解:
为什么要配置JAVA_HOME?:
第一、方便引用,配置path时,就是通过引用JAVA_HOME路径来实现的,这样避免了写很长一串的路径(比如在我的电脑中,path原路径是”C:\Program Files\Java\jdk1.8.0_131\bin”,通过指定JAVA_HOME,现在设定的path路径变成了”%JAVA_HOME%\bin”,更加简洁)。
第二、更加安全,当JDK改变时,仅需要改变JAVA_HOME的路径即可,path和CLASSPATH由于引用了JAVA_HOME,其所对应的路径也会更改。如果不引用JAVA_HOME,则JDK路径改变时,需要手动去设定PATH和CLASSPATH的路径,一旦路径错误,则程序会崩溃。
第三、第三方软件(如tomcat,eclipse)都是引用约定好的JAVA_HOME变量,如果不指定JAVA_HOME,则将无法使用第三方软件。
为什么要配置Path?:
配置Path是为了在任意目录下都能使用java、javac命令。这点可能不少人会疑惑,以往我安装qq等软件并没有去配置环境变量啊,一样可以用,为什么java就要配置环境变量?其实也不难理解,以往之所以能使用qq是因为鼠标点击了qq启动图标(即qq.exe启动程序),通过该启动程序打开了qq。
在java的jdk\bin文件目录下,也有许多类似程序(如java.exe, javac.exe),这些程序都是可以直接启动的,但前提是你需要在这个文件夹(”jdk\bin”文件夹)下来使用这个程序。
比如现在javac.exe在”C:\Program Files\Java\jdk1.8.0_131\bin”目录下,但我在”e:\新建文件夹”下写了一个“Test.java”程序,现在我想用javac命令来编译这个java程序,怎么办呢?最直接的方法就是把”Test.java”文件拷贝到”C:\Program Files\Java\jdk1.8.0_131\bin”目录下,这时候就可以直接通过javac命令来编译。但在实际编程中,我们不可能每次写完一个程序都把该程序拷贝到”C:\Program Files\Java\jdk1.8.0_131\bin”目录下,这就需要我们配置环境变量了,通过配置环境变量,向系统说明javac.exe所在的位置(”C:\Program Files\Java\jdk1.8.0_131\bin”目录),就可以在任意目录下使用javac命令,比如在刚刚的例子中,配置好环境变量,我们就可以直接在”e:\新建文件夹”下使用javac命令来编译”Test.java”文件。
为什么要配置CLASSPATH? :
CLASSPATH 环境变量我放在最后面,是因为以后你出现的莫名其妙的怪问题80%以上都可能是由于CLASSPATH设置不对引起的,所以要加倍小心才行。
配置CLASSPATH是为了引入一些已经写好的类。其实从名字中,也能看出它的功能,CLASSPATH是class(类)和path(路径)两个单词的组合。
设想一下,以往我们在写程序的时候,会使用import语句来引入一些已经写好的类,比如,当你写下improt java.util.时,编译器面对import关键字时,就知道你要引入java.util这个package中的类;但是编译器如何知道你把这个package放在哪里了呢?所以你首先得告诉编译器这个package的所在位置;如何告诉它呢?就是设置CLASSPATH啦 ? 如果java.util这个package在c:\jdk\ 目录下,你得把c:\jdk\这个路径设置到CLASSPATH中去!当编译器面对import java.util.这个语句时,它先会查找CLASSPATH所指定的目录,并检视子目录java\util是否存在,然后找出名称吻合的已编译文件(.class文件)。如果没有找到就会报错!
sun 为我们提供了一些额外的丰富的类包,一个是 dt.jar,一个是 tools.jar,这两个 jar 包都位于%JAVA_HOME%\lib 目录下,所以通常我们都会把这两个 jar 包加到我们的 classpath 环境变量中设置” CLASSPATH : %JAVA_HOME%\lib\dt.jar; %JAVA_HOME%\lib\tools.jar;”
我们一般这样设置:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
前面的“.”不可少,它代表了我们为自己的java类建立的工作路径,其它的是jdk自带的标准类库路径。
CLASSPATH的设定,对JAVA的初学者而言是一件棘手的事。所以Sun让JAVA2的JDK更聪明一些。你会发现,在你安装之后,即使完全没有设定CLASSPATH,你仍然能够编译基本的JAVA程序,并且加以执行。