一般情况下当我们写的java程序之中不包含除标准类库的其他类那么直接可以直接使用javac javasourcepath(java源文件的全路径)直接编译成功
例如有这样一个类在E:\eclipse_workspace_2018\jvm\src\jvm\demo>目录下,可以看到其中没有使用到除标准类库外的其他类那么这时就可以直接使用javac E:\eclipse_workspace_2018\jvm\src\jvm\demo\Test2.java就可以编译成功了。
一般在下述情况时要使用 -cp参数指定javac命令查找类文件所在的路径位置
1.在程序中加上一个外部jar包的类的import 这里使用了外部的servlet-api.jar
2.指定了包名(package jvm.demo) Test1.java使用了Test2.java的静态常量S1
3 未指定包名 Test1.java使用了Test2.java的静态常量S1
其中上述三种情况若是都使用javac Test1.java (除了第三种不指定包名的情况) 都是会编译失败的.下面解释一下原因
javac默认是从当前路径开始搜索使用到的类,我们是在E:\eclipse_workspace_2018\jvm\src\jvm\demo路径下执行的javac编译命令
第一种情况:Test1.java中import了javax.servlet.* 那么编译命令会在当前目录(E:\eclipse_workspace_2018\jvm\src\jvm\demo)下搜索javax.servlet包,这肯定是找不到的,那么这时需要使用-cp参数给他指定在D:\servlet-api.jar中查找,即使用javac -cp D:\servlet-api.jar Test1.java即可编译成功
第二种情况:Test1.java会在当前目录下查找Test2.java,因为指定了包(package jvm.demo),那么他会在当前目录下(E:\eclipse_workspace_2018\jvm\src\jvm\demo)查找package所指定包的子路径, 即E:\eclipse_workspace_2018\jvm\src\jvm\demo\jvm.demo,这肯定也是找不到的,那么这是需要使用-cp参数将查找路径指定在E:\eclipse_workspace_2018\jvm\src(../../)即可,即使用javac -cp ../../ Test1.java即可编译成功
第三种情况:同第二种情况擦不到,所不同的是未自动包名,则javac在当前路径下即可搜索到Test2.java,所以javac Test1.java即可编译成功
总结
待编译类未使用package指定包名,javac默认类搜索路径是当前路径,找到的类的路径为package + className(例:com.mh.Test)
待编译类使用了外部jar中的类 需使用-cp参数指定它的位置
待编译类使用了package指定了包名,javac默认会从当前目录找package的子目录,需使用-cp参数包所在的根目录
-cp指定多个路径时用“;”分隔,“.”代表当前路径