歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> SHELL編程

用shell腳本怎樣編譯java工程

編譯java工程一般直接用IDE或者用Ant、Maven之類的工具,很少有人用純shell來編譯java工程。正好遇到這樣一個應該,用這篇博文做一下記錄。
案例:本人用eclipse寫了一個java project,然後編譯打成jar包。

這個可以采用eclipse自帶的Export就可以導出jar了。但是為了軟件自動化等巴拉巴拉的原因,采用存shell腳本編譯。

\

如圖所示,java project的名稱為iec104,下面src是源文件目錄,bin是所引用的jar包目錄,現在要進行編譯,並且打成jar,如果對jar有所了解,都知道jar有個MANIFEST.MF文件,iec104工程的MF文件內容如下:

 

    Manifest-Version: 1.0
    Main-Class: com.zzh.run.Iec104RecvRun
意思就是制定了運行的main-class(有public static void main(String args[])的類)。
將這個文件拷貝到iec104的根目錄下,然後執行腳本compile.sh,內容如下:
#!/bin/bash

cur_dir=$(pwd)
echo $cur_dir

function do_compile_iec104(){
#    echo $cur_dir
    iec104=$cur_dir/iec104
    iec104_src=$cur_dir/iec104/src
    iec104_bin=$cur_dir/iec104/bin
#    echo $iec104_src
#    echo $iec104_bin
    iec104_class=$cur_dir/iec104/class

# 將iec104的src目錄下的所有java文件的名稱存入到iec104/src/sources.list文件中
    rm -rf $iec104_src/sources.list
    find $iec104_src -name "*.java" > $iec104_src/sources.list
    cat  $iec104_src/sources.list

# $iec104_class是存放編譯的class文件的目錄
    rm -rf $iec104_class
    mkdir $iec104_class

# 這裡開始編譯java文件,注意這裡的-encoding utf-8,博主剛開始並沒有加入這個,然後就報了一堆錯誤,糾結了很久才發現,這裡給各位提個醒了。
    javac -d $iec104_class -encoding utf-8 -classpath $iec104_bin/classes12.jar:$iec104_bin/junit-4.10.jar:$iec104_bin/log4j-1.2.17.jar:$iec104_bin/mysql-connector-java-5.0.5-bin.jar:$iec104_bin/RXTXcomm.jar -g -sourcepath $iec104_src @$iec104_src/sources.list

# 由於用到了log4j,所以要將log4j的配置文件一並放入,如果沒有用到,可以忽略這句
    cp $iec104_src/log4j.properties $iec104_class

# 如果原來在iec104目錄下有jar報就刪除掉,因為要生成新的
    rm $iec104/iec104.jar
# 這裡要cd到存放class的目錄,否則如果采用絕對路徑編譯,編譯出來的jar包裡面就是絕對路徑了,這樣就會有問題
# jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF $iec104_class/*這樣是錯誤的  
    cd $iec104_class
    jar -cvfm $iec104/iec104.jar $iec104/MANIFEST.MF *
# 賦予可執行權限
    sudo chmod a+x $iec104/iec104.jar
}

do_compile_iec104
exit 0
運行這個腳本(linux下)就可以編譯並且在iec104的目錄下就可以看到iec104.jar文件了。
這裡補充下java命令的基本知識:
javac 用於編譯Java文件,格式為:
java [options] [sourcefiles] [@files]
其中:
options:命令行選項;
sourcefiles:一個或多個要編譯的源文件;
@files:一個或多個對源文件進行列表的文件,有時候要編譯的文件很多,一個個敲命令會顯得很長,也不方便修改,可以把要編譯的源文件列在文件中,在文件名前加@,這樣就可以對多個文件進行編譯,對編譯一個工程很有用,方便,省事。
有幾個比較重要的選項:
-d 用於指定編譯成的class文件的存放位置,缺省情況下不指定class文件的存放目錄,編譯的class文件將和源文件在同一目錄下;
-classpath 可以簡寫成-cp,用於搜索編譯所需的class文件,指出編譯所用到的class文件的位置,如jar、zip或者其他包含class文件的目錄,指定該選項會覆蓋CLASSPATH的設定;
-sourcepath用於搜索編譯所需的源文件(即java文件),指定要搜索的源文件的位置,如jar、zip或其他包含java文件的目錄;
需要注意windows下和linux下文件路徑分隔符和文件列表(即-classpath和-sourcepath指定的文件)分隔符的區別:
windows下文件路徑分隔符用 \ ,文件列表分隔符用分號 ;
linux下文件路徑分隔符用 / ,文件列表分隔符用冒號 :
Copyright © Linux教程網 All Rights Reserved