使用java和javac命令的幾種情況:
1、單獨(dú)的一個(gè)java主程序;
2、帶包的一個(gè)java主程序;
3、同一個(gè)包的兩個(gè)類,一個(gè)引用另一個(gè);
4、引用不同包的其它類。
1、單獨(dú)的一個(gè)java主程序
public class Joeytang{
public static void main(String[] args) {
System.out.println("I am JoeyTang.");
}
}
將命令行到該java文件同一目錄;直接輸入命令javac Joeytang.java則會(huì)在當(dāng)前的文件夾下出現(xiàn)Joeytang.class類文件。如果想指定編譯的同時(shí)將編譯好的類文件放到一個(gè)文件夾下則可以使用-d指定路徑。例如javac -d .\ Joeytang.java則是在當(dāng)前目錄下,javac -d ..\ Joeytang.java 在上一個(gè)文件夾,javac -d ..\ a Joeytang.java則是在上一個(gè)文件夾下的a文件夾下,但是一定要保證指定的文件路徑存在。運(yùn)行該類文件,首先保證該類是具有main方法的類。然后編譯完以后,使用java -classpath .; Joeytang就可以運(yùn)行了。我開始沒有加-classpath選項(xiàng),老是提示說找不到類。所以一定要記住在這里加入該選項(xiàng)。具體該選項(xiàng)的作用是說在運(yùn)行時(shí)調(diào)用了外部的類或者包時(shí)在這里注明,即如果使用了a.jar則要加上-classpath .;a.jar其中前面的那個(gè)“.;”我理解成是把環(huán)境變量中配置的jar文件拿進(jìn)來。
2、帶包的一個(gè)java主程序
pakage my.friends
public class Joeytang{
public static void main(String[] args){
System.out.println("I am JoeyTang.");
}
}
這里面將Joeytang放到了my.friends包里面在編譯的時(shí)候進(jìn)入到Joeytang.java同一目錄,使用和上面一樣的javac命令,這時(shí)候會(huì)在同一目錄創(chuàng)建類文件,但是如果想讓編譯的時(shí)候?qū)慕Y(jié)構(gòu)也創(chuàng)建出來則可以使用-d選項(xiàng),javac -d .\ Joeytang.java,這時(shí)候會(huì)在當(dāng)前目錄下自動(dòng)根據(jù)包的結(jié)構(gòu)形式創(chuàng)建文件目錄,即創(chuàng)建my/friends/文件件,并將編譯好的類文件放在friends文件夾下。運(yùn)行的時(shí)候使用java my.friends.Joeytang來運(yùn)行。
3、同一個(gè)包的兩個(gè)類Joeytang.java文件為
pakage my.friends
public class Joeytang{
public String toString(){
return "Joey";
}
}
Sunnylu.java文件為
pakage my.friends
public class Sunnylu{
public static void main(String[] args){
Joeytang joey = new Joeytang();
//System.out.println("I am Sunney."+joey.toString()+" is my friend.");
System.out.println("I am Sunney."+joey+" is my friend.");
}
}
這種情況中Sunnylu類引用了Joeytang所以必須先編譯Joeytang按照第二種情況將Joeytang編譯,此時(shí)開始編譯Sunnylu,注意要使用javac -classpath .; -d .\ Sunnylu.java,此時(shí)加入了-classpath選項(xiàng),我也不知道為什么,但是如果不加編譯老是提示找不到Jeoytang這個(gè)。編譯完以后,來運(yùn)行Sunnylu也要加入-classpath選項(xiàng),java -classpath .; my.friends.Sunnylu
4、引用不同包的其它類
Tom.java文件為
package my.partners;
public class Tom{
public String toString(){
return "It's Tom";
}
}
Sunnylu.java文件為
pakage my.friends
import my.partners.Tom;
public class Sunnylu{
public static void main(String[] args) {
System.out.println( "I am Sunny.");
Tom tom = new Tom();
System.out.println(tom + " is my partner.");
Joeytang joey = new Joeytang();
System.out.println(joey + " is my friends.");
}
}
這種情況首先把Joeytang編譯了,然后編譯Tom類,因?yàn)門om為外部類所以在編譯Sunnylu的時(shí)候一定要在-classpath注明Tom的路徑例如如果我把Tom類編譯到當(dāng)前目錄的上一級目錄上去了,則編譯Sunnylu時(shí)使用javac -classpath .;..\ -d .\ Jerry.java,此時(shí)編譯時(shí)會(huì)到上一目錄按照Tom的包結(jié)構(gòu)來找Tom類。運(yùn)行時(shí)一樣要加入這個(gè)選項(xiàng)。
××××××××××××××××××××××××××××××××××××××××××
Exception in thread "main" java.lang.NoClassDefFoundError
程序:
public class TEST{
public static void main (String args[]){
System.out.println("HELLO THIS iS A JAVA PROCEDURE");
}
}
在命令提示符下
D:java>javac TEST.java
正常
D:java>java TEST
出現(xiàn)下面問題:Exception in thread "main" java.lang.NoClassDefFoundError: TEST
解決:
Exception in thread "main" java.lang.NoClassDefFoundError: Hello
這個(gè)錯(cuò)誤的原因就是:java解釋器找不到你自己定義的類HelloWorld
假如Hello.class在D盤D:\java目錄下, java.exe在C:\Java\jdk1.5.0_02\bin目錄下
有兩種解決辦法:
1. 在命令行模式下敲入
c:>C:\Java\jdk1.5.0_02\bin\java -classpath D:\java Hello
注意, 在HelloWorld前面有一個(gè)空格.
2. 在命令行模式下輸入
c:>set classpath=D:\java
c:>C:\Java\jdk1.5.0_02\bin\java Hello
以上兩種方法的本質(zhì)都是設(shè)定正確的classpath, 使得java
能夠找到你自己定義的類.