西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)java → 新手初學(xué)JAVA, 動手編譯、運行Java程序

新手初學(xué)JAVA, 動手編譯、運行Java程序

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:西西整理時間:2013/3/2 11:41:34字體大。A-A+

作者:haolujun點擊:0次評論:0次標簽: 編譯

  • 類型:安裝制作大。1.7M語言:英文 評分:5.3
  • 標簽:
立即下載

本人初學(xué)Java,看到別人都說學(xué)Java先不要用EcliPSe、NetBeans這些開發(fā)工具,所以索性就自己試試。過程犯的錯誤極多,參照著李剛老師那本瘋狂Java一點一點的實驗.由于自己使用過Makefile,所以就用Makefile做了實驗,總算是可以不用eclipse、NetBeans就能自己編譯運行一些小的程序了,下面就是我自己總結(jié)的心得,如有錯誤,請大家指正,謝謝。

本文分四小節(jié):

第一節(jié):配置Java運行時環(huán)境
第二節(jié):代碼的編譯以及運行
第三節(jié):如何打jar包以及使用jar包
第四節(jié):利用Makefile自動編譯運行Java程序

第一節(jié):配置Java運行時環(huán)境

本節(jié)以Windows XP為例,來配置Java運行環(huán)境。這節(jié)很簡單,我就長話短說。

1:下載JDK開發(fā)包,解壓安裝。
2:在用戶環(huán)境變量中增加PATH變量(在系統(tǒng)的環(huán)境變量中增加也行,但是可能需要重新啟動操作系統(tǒng)),并設(shè)置其值。

例如我把JDK安裝在F:\program\java目錄下,則把PATH變量設(shè)置成F:\program\java\jdk\bin,因為這個路徑下有我們要編譯、運行Java程序所需要的所有工具,比如javac.exe,java.exe,jar.exe....。之后我們就可以在cmd下使用javac、java、jar等命令了。

例如有一下Java源文件test.java,執(zhí)行javac Test.java就會在當前目錄下生成Test.class文件。之后我們運行java Test即可運行程序。當然也可以人為指定class文件的生成位置,利用-d選項。比如 javac -d D:\ Test.java,那么就可以在D:\目錄下看到Test.class了。

第二節(jié):代碼的編譯以及運行

對于寫Java程序而言,我們主張源文件與class文件都有相同的目錄結(jié)構(gòu),這樣不僅會方便代碼的組織管理,也使得在編譯以及運行Java程序時少犯錯誤。

1:位于默認包下的文件的編譯以及運行

//D:\src\A.java
class A{

    private int value;
   
    public A(){
        value = 0;
    }
   
    public void setValue(int var){
        value = var;
    }
   
    public int getValue(){
        return value;
    }

}

//D:\src\Test.java
public class Test{
    public void static void main(String[] args){
        A a = new A();
        a.setValue(10);
        System.out.println(a.getValue());
    }
}

我們運行javac Test.java,會發(fā)現(xiàn)D:\src目錄下多了A.class和Test.class兩個文件。運行java Test則可以在Dos中看到輸出為10。我們發(fā)現(xiàn)這兩個Java文件中并沒有package語句,所以這兩個文件同屬于一個默認包中(沒有顯示寫package的文件都是屬于默認包的)。

2: Java類發(fā)現(xiàn)規(guī)則

要想成功編譯java文件,需要有classpath和包名的共同配合。

類發(fā)現(xiàn)規(guī)則:class文件所在目錄 = classpath + '\' + 包名中的'.'全變成'\'

這個規(guī)則大家一定要記住,保證萬事OK!Java就是靠這個規(guī)則來尋找需要的class文件的。

例如:classpath=D:

//D:\src\A.java
package src;
public class A{

    private int value;
   
    public A(){
        value = 0;
    }
   
    public void setValue(int var){
        value = var;
    }
   
    public int getValue(){
        return value;
    }

}

//D:\Test.java
import src.*;
public class Test{
    public void static void main(String[] args){
        A a = new A();
        a.setValue(10);
        System.out.println(a.getValue());
    }
}

如果想要javac Test.java成功,則需要在D:\src(D:\src = D:\ + src)路徑下能夠找到A.class,否則編譯出錯。如果不存在D:\src目錄,則會返回包名不存在的錯誤信息。如果D:\src存在,但是該路徑下不存在A.class時,則報告沒有找到class文件。如果java文件存放目錄正確,并且也正確的指定了其所在的包,則javac會自動編譯A.java來生成A.class。

例如:上例就能夠正確的生成所有需要的class文件。但是如果把A.java中package語句去掉。之后編譯A.java生成A.class文件,之后在D:\下運行javac Test.java并不會成功,雖然在D:\src下存在A.class文件。

所以綜上所述,package語句中包名必須與生成的class文件所在的目錄保持一個關(guān)系,使得javac能夠找到相應(yīng)的class文件并且驗證一個文件是否處于正確的包中。

那么classpath是什么呢?從名字也能猜得到,classpath代表class文件的存放路徑。這是個環(huán)境變量,可以添加到用戶的環(huán)境變量中,其值則根據(jù)編程時具體包名、以及類的存放路徑來設(shè)定。如果不想用環(huán)境變量,也可在編譯時用-classpath來設(shè)置。

classpath可以設(shè)置多個路徑,路徑之間利用';'相隔。編譯時,javac會逐個嘗試classpath的每個路徑和文件的包名的組合,直到找到相應(yīng)的class文件為止。但是如果通過classpath與包名的組合在多個不同的路徑下都找到了同名類,則會返回錯誤信息。

由于javac默認情況下在java文件的當前目錄生成class文件,所以人們經(jīng)常把'.'添加到classpath中,代表當前文件所在的路徑。高版本的Java編譯以及運行程序可能會自動把'.'添加到classpath中。上面的例子中由于Test.java位于A.java的上一級目錄中,所以把classpath設(shè)置成'.'時,也能編譯成功。

現(xiàn)在說說把classpath設(shè)置成'.',它代表當前運行目錄。那么什么是這個當前運行目錄呢?其實就是運行javac時所在的目錄,注意:切不可認為是當前編譯的那個java文件所在的目錄。

如果java文件中顯示的寫了package packagename 則為class文件指定了包,那么這個class文件也必須應(yīng)在packagename轉(zhuǎn)換后的相應(yīng)子目錄下。如果不寫,則表示該class文件在默認包中。

現(xiàn)在來說說如運行java程序。
例如:classpath=D:

/D:\src\A.java
package src;
public class A{

    private int value;
   
    public A(){
        value = 0;
    }
   
    public void setValue(int var){
        value = var;
    }
   
    public int getValue(){
        return value;
    }

}

//D:\src\Test.java
package src;
import src.*;
public class Test{
    public void static void main(String[] args){
        A a = new A();
        a.setValue(10);
        System.out.println(a.getValue());
    }
}

我們?nèi)绾芜\行這個程序呢?

首先在src目錄下運行: javac Test.java

之后在任意目錄下運行:java  src.Test

注意:切不可運行java Test命令,會提示找不到類的錯誤(即使在Test.class文件所在目錄也不行)。所以運行指定了package程序時,需要顯示的寫出其包名,即:java packagename.classname,其遵循與class文件一樣的尋找規(guī)則,即在classpath+packagename中'.'變成'\' 所表示的路徑下能夠找到相應(yīng)的classname所指的class文件。

第三節(jié):如何打jar包以及使用jar包

打jar包使用jar命令。

//D:\src\A.java
package src;
public class A{

    private int value;
   
    public A(){
        value = 0;
    }
   
    public void setValue(int var){
        value = var;
    }
   
    public int getValue(){
        return value;
    }

}

首先在src目錄下運行javac A.java生成A.class。之后在D:\目錄下運行jar -cvf test.jar src就會在D:\這個目錄下生成test.jar,即我們打的jar包。那么我們?nèi)绾问褂眠@個jar包呢?首先必須把test.jar的路徑加入到classpath中。之后我們有如下的測試程序。

import src.*; //必須得有此import,因為A.class位于src包中。如果不寫則編譯不通過。

public class B{

    public static void main(String[] args){
        A a = new A();
    }
}

jar文件其實是一個壓縮包,可以很容易的用解壓軟件進行解壓。解壓后有如下目錄關(guān)系:

test.jar
   |--src---|--A.java
            |--A.class

這里可以把test.jar當成目錄來處理,javac會自動在classpath中解壓這個test.jar并根據(jù)B.java中的import找到其中的src文件夾下的A.class文件并使用。

現(xiàn)在看看我們的打包命令 jar -cvf test.jar src  //意思是把src文件夾整個打包

如果我們這么打包: 在src目錄下運行jar -cvf test.jar A.java A.class,行嗎?答案是不行。因為這樣打包后路徑關(guān)系為:

test.jar
   |--A.java
   |--A.class

javac尋找A.class時發(fā)現(xiàn)test.jar下不存在src目錄,則會報不存在包的錯誤。所以大家一定要注意打包時應(yīng)該把那個目錄打進去,不應(yīng)把哪個目錄打進去。如果對屬于默認包的class文件打包,則只要把jar包路徑添加到classpath中即可使用,無需再在程序中使用import。當然jar命令還有很多參數(shù)可選,來滿足各種不同需要的打包需求,這些就不說了。

4:利用Makefile自動編譯運行Java程序

下面給出一個簡單的例子:這個例子中,沒有手動設(shè)置Windows的環(huán)境變量,而是用-classpath指定,這樣方便在不同機器之間移植。

如下目錄結(jié)構(gòu):

project---|---src---|---main---|---Test.java
          |         |---package1---|---A.java
          |            |              |---B.java
          |         |
          |         |---package2---|---C.java
          |         |---Makefile
          |
          |---classes---|---main---|---Test.class
                        |---package1---|---A.class
                        |              |---B.class
                        |
                        |---package2---|---C.class

代碼如下:

//A.java
package package1;
public class A{

    private int value;
    
    public A(){ value = 0; }
    
    public void setValue(int var){
        value = var;
    }
    
    public int getValue(){
        return value;
    }
}

//B.java
package package1;
public class B{

    private String name;
    
    public B(){ name = null; }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }

}

//C.java
package package2;
public class C{

    private String name;
    
    public C(){ name = null; }
    
    public void setName(String name){
        this.name = name;
    }
    
    public String getName(){
        return name;
    }

}

//Test.java
import java.util.*;
import package1.*;
import package2.*;
public class Test{

    public static void main(String[] args){

        A a = new A();
        B b = new B();
        C c = new C();
        
        a.setValue(3);
        b.setName("Java");
        c.setName("Test");
        
        System.out.println(a.getValue());
        System.out.println(b.getName());
        System.out.println(c.getName());
    }
}

Makefile如下:

//Makefile
target:
    javac ./package1/A.java -d ../classes
    javac ./package1/B.java -d ../classes
    javac ./package2/C.java -d ../classes
    javac ./main/Test.java  -d ../classes/main/ -classpath ../classes
run:
    java -classpath ../classes/main;../classes Test
clean:
    rm -rf ../classes/package1/*.class
    rm -rf ../classes/package2/*.class
    rm -rf ../classes/main/*.class

運行:make
D:\Java\project\src>make
javac ./package1/A.java -d ../classes
javac ./package1/B.java -d ../classes
javac ./package2/C.java -d ../classes
javac ./main/Test.java -d ../classes/main/ -classpath ../classes

運行:make run
D:\Java\project\src>make run
java -classpath ../classes/main;../classes Test
3
Java
Test

這樣,其實我們完全可以不用Eclipse、Netbeans等開發(fā)工具就能自己編譯運行自己的系統(tǒng)了。

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(0)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字數(shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)
    推薦文章

    沒有數(shù)據(jù)