2013年6月6日 星期四

[Java] Complier Java on Linux

[Java] java.lang.ClassNotFoundException on Eclipse 介紹了如何使用Ecslipse來產生Jar,接下來介紹一下如何在Linux下,Compiler Java。
雖然是在寫Java的程式,不過還是利用Linux的習慣來建立Java專案,以下是我的目錄架構以及分類


bin : 所產生的class目錄
lib : 使用到的外部jar
Makefile : Compiler Process
META-INF : MANIFEST.MF的目錄
out : 產出的jar檔
src : source code目錄,須使用java的目錄格式


  • Makefile
  • 要使用外部jar檔,有幾個需要注意的部分
    1. 如果你希望把外部的jar包進你的jar檔裡面,那要使用外部的jar檔,必須在自己的程式裡面撰寫動態load class。

    2. 外部import jar檔進來,也分成兩個方法(以下介紹此方法),
        2-1. 執行jar檔時,加入-cp .:lib/commons-io-2.4.jar (note: 有一個 .)。
        2-2. 寫入在MANIFEST.MF,當執行jar檔時,就會找MANIFEST.MF定義的位置。
    BIN = bin
    SRC = $(shell find src -name *.java)
    OUT = out
    LIBS = lib/commons-io-2.4.jar;lib/jtds-1.2.7.jar
    MANIFEST = META-INF/MANIFEST.MF
    TARGET = $(OUT)/test.jar

    all: build-class create-jar
    build-class:#compiler src/com/test.java,並放置bin下
        javac -sourcepath $(SRC) -classpath $(LIBS) -d bin $(MAIN_FILE)

    # Note : javac Options :
    # -sourcepath : .java檔的位置 # -classpath : 指定外部jar檔或class
    # -d : class放置的位置

    create-jar: # 封裝成jar檔
        jar cvfm $(TARGET) $(MANIFEST) -C $(BIN) .
        cp $(LIBS) $(OUT)

    # Note : jar Options :
    # c : 建立一個新的jar檔
    # v : 顯示包裝運作的過程.
    # f : 指定要放到jar檔的檔案
    # C : change dir

    clean:
        rm -rf $(BIN)/* $(OUT)/*



  • META-INF/MANIFEST.MF
  • Class-Path 指的是外部jar檔
    Manifest-Version: 1.0
    Sealed: true
    Main-Class: com.test
    Class-Path: lib/commons-io-2.4.jar


  • src/com/test.java

  • package com;
    import org.apache.commons.io.FileUtils;
    import java.io.File;
    import java.io.IOException;
    public class test {
        static public void main(String[] args) {
            File src = new File ( args[0] );
            File dst = new File ( args[1] );
            try {
                FileUtils.copyFile(src,dst);
            } catch ( IOException e ) {
                System.out.println("copy error");
            }
        }
    }


  • 以上都設定好後,就可以make

  • make
    #在output可以得到兩個檔案
    1. lib/commons-io-2.4.jar
    2. test.jar


  • 執行結果

  • cd output
    java -jar test.jar lib/commons-io-2.4.jar lib/tst

    #note : 如果在MANIFEST.MF沒有填寫Class-Path,則下另一個command
    java -cp lib/commons-io-2.4.jar -jar test.jar lib/commons-io-2.4.jar lib/tst

    沒有留言:

    張貼留言