天天看點

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

一、開發環境

1.內建開發環境

       配置Java運作時環境(JDK)、Eclipse、NetBeans這些開發工具

2.獨立開發環境

       僅需要配置Java運作時環境(JDK):

             (1)下載下傳jdk解壓;

             (2)修改環境參數/etc/bash.bashrc:

                #add fot aosp build tony/2015/1/13

                export JAVA_HOME=/opt/java/jdk1.6.0_45

                export JRE_HOME=$JAVA_HOME/jre

                export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JRE_HOME/lib

                export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin:$JAVA_HOME/lib:$JAVA_HOME

二、代碼的編譯以及運作

       對于寫Java程式而言,我們主張源檔案與class檔案都有相同的目錄結構,這樣不僅會友善代碼的組織管理,也使得在編譯以及運作Java程式時少犯錯誤。

1:位于預設包下的檔案的編譯以及運作(沒有顯式寫package的.java檔案檔案都是屬于預設包的)

     (1)檢視源檔案Test.java   &&  A.java

             (我們發現這兩個Java檔案中并沒有package語句,是以這兩個檔案同屬于一個預設包中。)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
//src/Test.java

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

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

}
           

     (2)編譯java:javac  Test.java

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

     (3)運作java:java  Test

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

2:位于自定義package(包)的檔案的編譯以及運作(顯式寫package)

(1)檢視源檔案Test.java   &&  A.java

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
///src/a_package/A.java

package  a_package;///使用package

public class A{

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

}

///src/Test.java

import  a_package.*;///使用package

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

(2)編譯java:javac  Test.java

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

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

         .CLASS類發現規則:class檔案所在目錄 = classpath + '\' + 包名(包名中的'.'全變成'\')

          !!!!!Java就是靠這個規則來尋找需要的class檔案的。

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

(3)運作java:java  Test

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

        運作指定了package程式時,需要顯示的寫出其包名,即:java   packagename.classname,其遵循與class檔案一樣的尋找規則,即在classpath+packagename中'.'變成'\' 所表示的路徑下能夠找到相應的classname所指的class檔案。

三、關于JAR包:如何打jar包以及使用jar包?

0.何為jar包?

       JAR(Java Archive,Java 歸檔檔案)是與平台無關的檔案格式,它允許将許多檔案組合成一個壓縮檔案。為 J2EE 應用程式建立的 JAR 檔案是 EAR 檔案(企業 JAR 檔案)。

       JAR 檔案格式以流行的 ZIP 檔案格式為基礎。與 ZIP 檔案不同的是,JAR 檔案不僅用于壓縮和釋出,而且還用于部署和封裝庫、元件和插件程式,并可被像編譯器和 JVM 這樣的工具直接使用。在 JAR 中包含特殊的檔案,如 manifests 和部署描述符,用來訓示工具如何處理特定的 JAR。

1.如何打jar包--概述?(參見:http://lishumingwm163-com.iteye.com/blog/954061)

(1)打包根目錄下面的檔案:   jar  cvf   filename.jar   a.class   b.class 

(2)打包帶package的檔案:jar cvf filename.jar   foldername 或  jar cvf filename.jar foldername\*

(3)打包可執行jar包(有main入口的):

         A.先配置manifest.mf檔案,内容如下:

         Main-Class: com.TestBean///指定入口函數,說明預設執行com.TestBean的main函數。

         Class-Path: lib\classes12.jar///配置依賴jar包

         B.打包方法:jar  cvfm    filename.jar manifest.mf(指定配置檔案) *.class(class包)     lib\classes12.jar(依賴包) 

                              或者同(2)

         C.執行方法:java -jar filename.jar

下面一一介紹。

2.打包jar包  以及  使用jar包?(針對屬于預設包的class檔案打包:無package顯示)

(1)打包:(前提是:已經編譯完成的class檔案(含java源檔案))

A.java源檔案如下:

public class A{

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

}
           
一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

打包指令:

           [email protected]:~/test-jar-1$jar -cvf test.jar A.class

           added manifest

           adding: A.class(in = 345) (out= 248)(deflated 28%)

           [email protected]:~/test-jar-1$

(2)使用jar包:如果對屬于預設包的class檔案打包,則隻要把jar包路徑添加到classpath中即可使用,無需再在程式中使用import。測試執行個體如下:

test_jar.java

public class test_jar{

    public static void main(String[] args){

        A a = new A();

    }

}

3.打包jar包  以及  使用jar包?(針對屬于非預設包的class檔案打包:有package顯示)

(1)将要打包成jar的package:a_package  (其下) 以及  測試(使用jar包)的測試程式test_jar_package.java

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
<span style="font-size:18px;">//D:<span style="font-size:18px;">a_package</span>/A.java
package <span style="font-size:18px;"> a_package</span>;
public class A{

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

}</span>
           

(2)打包jar包:jar -cvf a-package.jar a_package/(前提是a-package檔案夾下的A.java 已經編譯完成如(1)所示)

        (!如果對屬于預設包的class檔案打包,則隻要把jar包路徑添加到classpath中即可使用,無需再在程式中使用import!)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

     打包後的jar檔案是:a-package.jar

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

     該jar包的具體組成是:

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

(3)測試執行個體------編譯運作測試程式:使用jar包

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

                                        ///!如果對屬于預設包的class檔案打包,則隻要把jar包路徑添加到classpath中即可使用,

                                        ///無需再在程式中使用import!)

       public class Test{

                  public  static void main(String[] args){

                 A a = new A();

                 a.setValue(10);

                 System.out.println(a.getValue());

                 }

          }

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

4.打包jar包  以及 使用jar包?(可以直接運作的jar包: java -jar  test.jar=====必須保證有main()入口)

(可以參見:http://jingyan.baidu.com/article/3c48dd344a2146e10be3588c.html)

(1)待測試源碼的編譯:

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

///test/test_jar.java

package test;   //指定上級檔案夾(package)的名字

public class test_jar{

    public static void main(String[] args){

         System.out.println("hello jar...!");  

    }

}

///javac  test_jar.java

(2)打包已經編譯好的源碼為jar包(jar cvf my-test.jar test/)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式
一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

(3)修改manifest腳本:添加主函數入口(main)---即添加最後一行(注意:後有空格額!)

打開可以使用

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

(4)運作jar 檔案(java -jar my-test.jar)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

四、利用Makefile自動編譯運作Java程式

      下面給出一個簡單的例子:這個例子中,沒有手動設定Windows的環境變量,而是用-classpath指定,這樣友善在不同機器之間移植。

1.項目結構

(1)make 前(編譯前)(隻含有java源檔案和某些目錄)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

(2)make 後(編譯後)(包含最終生成的class檔案)

一---Android-SDK系列文章(3) ---java(自己動手編譯、運作Java程式)一、開發環境二、代碼的編譯以及運作三、關于JAR包:如何打jar包以及使用jar包?四、利用Makefile自動編譯運作Java程式

2.項目源碼

<span style="font-size:18px;">//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());
    }
}</span>
           
<span style="font-size:18px;">//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</span>
           

解析makefile:編譯/運作java檔案時,都可能需要用到 .class 檔案,是以需要指定classpath的路徑

3.項目編譯&&運作

(1)編譯:

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

(2)運作:

make run

D:\Java\project\src>make run

java -classpath ../classes/main;../classes Test

3

Java

Test

        這樣,其實我們完全可以不用Eclipse、Netbeans等開發工具就能自己編譯運作自己的系統了。當然這僅僅是限于小工程或是更好的了解編譯/運作java程式的過程,對于大型工程還是需要IDE 工具開發,以提高效率。