命令行環境下Java編譯運行
1. java的運行機制的基本概念:
源文件 也就是我們熟知的.java文件。
類文件 .class文件是編譯器由.java文件編譯而成。眾所周知,Java的跨平台性在於Java虛擬機(JVM)這一層對硬件的隔離,而.class文件可以理解為JVM中的執行文件(自己的理解,可能不太准確)。里面存儲的是java字節碼,javabytecode 是基於棧的(stackbased)(關於字節碼和JVM更詳細的官方解釋可以參照 The JavaVirtual Machine Specification ,如果嫌那本書太厚,另外再推薦一本 Programmingfor the Java Virtual Machine)。
編譯 Java的編譯一般是指從源文件(.java文件)到類文件(.class文件)的轉化過程。在JDK命令行中是 javac 命令(javacompiler的縮寫~跟C語言木關系的~)
運行 在JVM中執行.class文件。是 java 命令。
2. linux 下安裝jdk
首先在linux下安裝jdk,如果出現提示權限不夠(且root下也提示權限不夠),可用#ls-l filename命令查看一下,如果顯示類似如:
-rw-rw-rw- 1 root root ….
則表示任何用戶都沒有可執行權限(即使是root用戶)。
解決方法:
#chmod a+x filename
這樣,安裝好后,就可以接下來進行環境變量的配置了。
我們需要設置三個環境變量:JAVA_HOME、PATH 和 CLASSPATH。
JAVA_HOME:該環境變量的值就是 Java 所在的目錄,一些 Java 版的軟件和一些 Java 的工具需要用到該變量,設置 PATH 和 CLASSPATH 的時候,也可以使用該變量以方便設置。
PATH:指定一個路徑列表,用於搜索可執行文件的。執行一個可執行文件時,如果該文件不能在當前路徑下找到,則依次尋找 PATH 中的每一個路徑,直至找到。或者找完 PATH 中的路徑也不能找到,則報錯。Java 的編譯命令 (javac),執行命令 (java)和一些工具命令 (javadoc, jdb 等) 都在其安裝路徑下的 bin 目錄中。因此我們應該將該路徑添加到 PATH 變量中。
CLASSPATH:也指定一個路徑列表,是用於搜索 Java 編譯或者運行時需要用到的類。在 CLASSPATH 列表中除了可以包含路徑外,還可以包含.jar 文件。Java 查找類時會把這個 .jar 文件當作一個目錄來進行查找。通常,我們需要把 JDK 安裝路徑下的 jre/lib/rt.jar (Linux: jre/lib/rt.jar)包含在 CLASSPATH 中。
PATH 和 CLASSPATH 都指定路徑列表,列表中的各項 (即各個路徑) 之間使用分隔符分隔。在 Windows 下,分隔符是分號 (;),而在 Linux 下,分隔符是冒號 (:)。
目前這兩步,服務器JDK安裝和環境變量設置都已經弄好了。
3. 編譯運行命令
編譯
javac [-d] [-o] [-verbose] [-classpath][-sourcepath]
-d, 指定生成的.class文件存放目錄,一般省略則默認放在java源文件同一目錄下
-o, 這個選項告訴javac優化內聯的static,final以及privite成員函數所產生的碼。
-verbose,此選項告知java顯示出有關被編譯的源文件和任何被調用類庫的信息。如-verbose:class能看到各種加載的信息,-verbose:gc 是garbagecollection 的信息
-classpath,設定要用到的類路徑,可以是目錄,jar文件,zip文件(里面都是class文件),值得注意的是,此classpath中的內容是會覆蓋掉環境變量CLASSPATH里面的設定。也可以省略,省略則默認使用環境變量$CLASSPATH路徑。
所以一般classpath的設定都是:當前目錄加環境變量CLASSPATH設置目錄,如
javac -classpath .:$CLASSPATH abc.java java基本類一般都在JDK環境變量$CLASSPATH中指定好路徑了
自己需要用到的第三方類一般都放在文件當前目錄下,用.指定路徑即可
若自己需要添加一些類可以在.:$CLASSPATH后面添加“:類的具體路徑”。

-sourcepath, 設定要編譯的java文件路徑,可以是目錄,jar文件,zip文件(里面都是java文件)。
若編譯的是jar包中的主類文件abc.java時,一般編譯整個包javac edu.test.jar或者包文件夾javac ./edu/test。
一般當java文件中有多個需要編譯時,可以逐一列出,也可以將文件名列在一個文件中,名稱間用空格或者回車行來進行分隔,然后在命令行中使用該列表名,名字前冠以@字符,如:
javac @usr/test/sourcefile.list 目錄usr/test 下的sourcefile.list
說明
1)一般,對於只有一個出口主函數main,其他java文件是以內聯類的形式被主函數調用的多個java文件組成的工程來說,編譯時只需要對出口主函數main所在java文件編譯即可,工程中的其他java文件會自動關聯編譯。
2)對於程序中調用到了第三方類或者package的情況,則一般先需要在程序文件中加入import第三方類或者jar包.* 如
import edu.test.abc 引用jar包edu.test下的abc.java,如果直接引用文件夾的話,則是edu/test文件夾下的abc.java文件。為穩妥,一般都引用整個包內文件import edu.test.*。
(jar包名對應文件夾路徑,將某個路徑文件夾下的所有java文件進行打包即為jar包,引用時可以直接引用文件夾)
編譯時需要將jar包路徑或者文件夾根目錄,如edu的路徑加入到classpath中。一般常把jar包或者根文件夾拷貝到當前目錄下,指定classpath為.,編譯器自動會從當前目錄開始尋找。
運行
java [-classpath] [-sourcepath]

-classpath和編譯時一致,指定運行時要搜索的類路徑。需要注意的是,由於所要執行的類也是要搜索的類的一部分,所以一定要把這個類的路徑也放到classpath設置里,故在要執行的類的路徑里執行java命令時,一定要加上.表示當前目錄也搜索。
-sourcepath 指需要運行的目標文件名(不要后綴名),如編譯javac a.java則運行java a。若運行的是jar包中的主類文件時需要指出包路徑並要在class名前帶上完整的包名,如java edu,test.abc。且該包的根目錄(edu所在文件夾路徑)需要包含在classpath中。
說明:
1)文件搜索時,系統只會向下,從指定目錄向其子目錄搜索,不會溯源向其父祖目錄搜索。
2)運行時,classpath應同時包含執行的目錄和調用類的目錄,一般兩者放在同一根目錄下,運行時在根目錄下運行。不然會出現錯誤找不到運行的main函數。如
調用的類文件./com/bao/ws/h.class,執行文件為./com/bao/bs/a.class,classpath應包含.路徑
