java運行顯示“找不到或無法加載主類”!一般都自然想到是環境沒配置好.但是 也可能是,絕對路徑的問題.
今天一個不會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程序,並且加以執行。