Java 源程序的編譯大家都知道,也就是 cmd 中到源文件所在目錄下 javac **.java 即可,當(dāng)程序中有包聲明還能簡(jiǎn)簡(jiǎn)單單的直接 javac **.java 嗎?答案當(dāng)然是 no,下面舉個(gè)簡(jiǎn)單的例子證明一下直接 javac **.java 會(huì)怎么樣。
如下:F:javaweb2班20160531目錄下有A.java 文件,注意源文件中有包聲明:
實(shí)例
現(xiàn)在對(duì) A.java 直接進(jìn)行編譯 javac A.java 結(jié)果如下:
我們可以清楚地看到當(dāng)前目錄下出現(xiàn)了A.class字節(jié)碼文件,就這樣能不能直接運(yùn)行呢?試試吧!
出現(xiàn)了這樣的錯(cuò)誤,原因是我們?cè)?A.java 中有包聲明,當(dāng)執(zhí)行 A.java 源文件時(shí) java 虛擬機(jī)首先會(huì)在 A.java 當(dāng)前目錄尋找字節(jié)碼文件,雖然這下找到了,但是因?yàn)樵?A.java 中有包聲明,java 虛擬機(jī)緊接著去包目錄下尋找有沒(méi)有 A.class 字節(jié)碼文件,這下找到了才能夠成功執(zhí)行,不信我們做做實(shí)驗(yàn)?。ㄟ@里我再教教大家怎么編譯有包聲明的 A.java,也就是打包編譯 javac -d . A.java 即可)
這下就打包編譯成功了,這時(shí)我們可以看到 mypack 目錄下出現(xiàn)了 A.class 文件,下面試試執(zhí)行吧
這時(shí)我們發(fā)現(xiàn)執(zhí)行還是不能通過(guò)??這時(shí)為什么呢?這里是許多新手遇到的問(wèn)題,在這里大家必須謹(jǐn)記一點(diǎn):Java 命令的參數(shù)是”類(lèi)的完整類(lèi)名”,而不是”文件名”。
這個(gè)源程序的完整類(lèi)名應(yīng)該是 mypack.A,因此應(yīng)該這么寫(xiě):java mypack.A
這下就可以成功執(zhí)行了!
別急??!下面還有更精彩的!作為包的使用怎么可能會(huì)不講解一下包的導(dǎo)入創(chuàng)建編譯呢!
這次我們引入另外一個(gè)測(cè)試類(lèi) Test.java,代碼如下:
實(shí)例
編譯執(zhí)行如下:
結(jié)果意料之中肯定是能夠編譯執(zhí)行的,執(zhí)行流程是這樣的:Test.java 編譯之后生成的字節(jié)碼文件在當(dāng)前目錄(編譯時(shí)他會(huì)尋找 mypack 中是否有 A.class 文件,若無(wú),編譯不通過(guò)),執(zhí)行時(shí),由于 Test.java 中沒(méi)有包聲明,java 虛擬機(jī)首先在當(dāng)前目錄找到 Test.class 就會(huì)執(zhí)行,執(zhí)行到程序中引用到A類(lèi)的地方,然后 java 虛擬機(jī)在當(dāng)前目錄看是否有 A.class 字節(jié)碼文件,這時(shí)即使發(fā)現(xiàn)了也會(huì)根據(jù)源程序中的包導(dǎo)入進(jìn)入包中尋找 A.class,找到才能執(zhí)行成功(其實(shí)在編譯階段就已經(jīng)尋找了?。?/p>
下面更進(jìn)一步:若我們給測(cè)試類(lèi) Test.java 加上包聲明 package mypack1;
這時(shí)我們對(duì) Test.java 進(jìn)行打包編譯,這里我又要給大家講解兩個(gè)知識(shí)點(diǎn):1.打包編譯時(shí),會(huì)自動(dòng)創(chuàng)建包目錄,不需要自己新建包名文件夾;2.當(dāng)當(dāng)前目錄有多個(gè)java文件需要編譯或打包編譯時(shí),javac -d . *.java 指令可以給當(dāng)前目錄下的所有 java 文件根據(jù)程序中是否有包聲明進(jìn)行編譯或打包編譯。
這時(shí)我們又該如何執(zhí)行 Test.java 文件呢?java Test.java 嗎??顯然這樣是不行的,還記得我前面講過(guò)的么:Java 命令的參數(shù)是”類(lèi)的完整類(lèi)名”,而不是”文件名”。
因此我們需要這樣執(zhí)行:
這樣就:
上面講的這些都是一般情況,也就是類(lèi)路徑都是在當(dāng)前目錄下,當(dāng)類(lèi)路徑不在當(dāng)前目錄下是否還能執(zhí)行呢?又該如果執(zhí)行呢?
如下圖我把 Test.java 放到外面一層目錄,這時(shí)我們就需要自己設(shè)置 classpath 參數(shù)。例如:F:javaweb2班>java -cp?F:/javaweb2班/20160531 mypack1.java;或者在任意目錄下:java -cp?F:/javaweb2班/20160531 mypack1.java
這樣就成功了!具體的執(zhí)行流程大家自己分析體會(huì)吧!
總結(jié)一下
- 1、Java 命令的參數(shù)是”類(lèi)的完整類(lèi)名”,而不是”文件名”。
- 2、打包編譯時(shí),會(huì)自動(dòng)創(chuàng)建包目錄,不需要自己新建包名文件夾。
- 3、當(dāng)當(dāng)前目錄有多個(gè) java 文件需要編譯或打包編譯時(shí),javac -d . *.java 指令可以給當(dāng)前目錄下的所有 java 文件根據(jù)程序中是否有包聲明進(jìn)行編譯或打包編譯。
- 4、當(dāng)類(lèi)路徑不在當(dāng)前目錄下時(shí),需要用到 java -cp …,如:java -cp?F:/javaweb2班/20160531 mypack1.java。
- 5、要清楚 java 虛擬機(jī)根據(jù)包聲明包導(dǎo)入執(zhí)行字節(jié)碼文件的流程。
原文地址:https://www.cnblogs.com/xiaoming0601/p/5551113.html