查看完整版本: 本人在前公司写的java项目构建打包脚本

ronstar 2007-3-30 00:55

本人在前公司写的java项目构建打包脚本

bash脚本:depweb.sh
运行环境:linux/UNIX操作系统,CVS配置管理库,ant工具,JDK
局限性:只对java代码进行构建
实现功能:取出全量版本标签(代码基线标签)代码,进行构建,封装打包(tar ball)
把包发布给部署人员进行部署,部署完毕通知测试人员可以对此版本产品进行测试。
编写此脚本的目的:简化基于java代码项目的编译,完成一个通用java代码的构建脚本,通过对配置文件的设置来达到对多个项目进行构建。

运行前可以通过执行
depweb.sh -h  来查看脚本的帮助(简明使用方法)
运行前需要设置配置文件,可以通过执行
depweb.sh -i project
生成project-build.properties配置文件,配置文件内容填写实例如下:
[code]# Must set the "CVSROOT" environment variable
CVSROOT=:pserver:user:passwd@cvs-server:/cvs/repository/root
     
# Must set the module name of project in CVS Repository
MODULE_NAME=projectsample
     
# Must set the "$module" source code path relative to \$CVSROOT
SRC_PATH=projectsample/codepath/

# Must set the java files path relative to $SRC_HOME
javadir=src"

# Must set the class files path relative to $DST_HOME
classdir=WEB-INF/classes

# Must set the jars path relative to \$SRC_PATH
srclib=WEB-INF/lib

# The absolute common lib path
svrlib=/userhome/soft/tomcat/common/lib

以下内容为脚本内容,此内容包含整个构建打包过程以及一个build.xml的模板
####################################################
#prog:depweb.sh                                                                                                   #
#func:Web Application build create and tar package                                              #
#vern:1.6                                                                                                                #
#auth:liurs                                                                                                              #
#comp:FORLINK                                                                                                      #
####################################################
#!/bin/sh

usage()
{
        clear
        echo        "USAGE: $PROG [-a|--add] [-h|--help] [-i|--initial] [-c|--complete]"
        echo       
        echo         "WHERE: -h --help         = Display help infomation"
        echo         "Usage: $PROG -h|--help"
        echo
        echo         "        -i --initial        = 设置配置文件,初始化构建环境"
        echo         "Usage: $PROG -i <模块名>"
        echo
        echo         "       -a --add         = 直接增量部署,用如下格式:"
        echo         "Usage: $PROG -a <增量标签> <模块名>"
        echo
        echo         "       -c --complete        = 初始全量部署,用如下格式:"
        echo        "Usage: $PROG -c <全量标签> <模块名>"
        echo
        echo         "正常全量部署,用如下格式:"
        echo         "Usage: $PROG <全量标签> <模块名>"
        echo
        return 0
}

setsample()
{
        clear
        echo         "PREREQUISITES:"
        echo
        echo         "* The $HOME/build/\$MODULE-build.properties must be set"
        echo         "* such as: "
        echo
        echo         "# Must set the "CVSROOT" environment variable"
        echo         "CVSROOT=:pserver:user:passwd@cvs-server:/cvs/repository/root"
        echo
        echo        "# Must set the module name of project in CVS Repository"
        echo         "MODULE_NAME=projectsample"
        echo
        echo    "# Must set the "$module" source code path relative to \$CVSROOT"
        echo         "SRC_PATH=projectsample/codepath/"
        echo
        echo        "# Must set the java files path relative to $SRC_HOME"
        echo        "javadir=src"
        echo
        echo        "# Must set the class files path relative to $DST_HOME"
        echo        "classdir=WEB-INF/classes"
        echo
        echo        "# Must set the jars path relative to \$SRC_PATH"
        echo         "srclib=WEB-INF/lib"
        echo
        echo        "# The absolute common lib path"
        echo        "svrlib=/userhome/soft/tomcat/common/lib"
        echo
        return 0
}

echoxml()
{
echo '<?xml version="1.0" encoding="GB2312"?>
<project name="proname" default="all" basedir=".">
    <property environment="sysenv"/>
    <property file="${sysenv.MODULE}-build.properties"/>
    <property name="proname"            value="${sysenv.MODULE}"/>
    <property name="srcdir"             value="${sysenv.SRC_HOME}"/>
    <property name="dstdir"             value="${sysenv.DST_HOME}"/>
    <property name="depdir"             value="${sysenv.DEP_HOME}"/>
    <property name="wwwdir"             value="${sysenv.WWW_HOME}"/>
    <property name="date"               value="${sysenv.DATE}"/>
    <property name="cvshome"            value="${sysenv.CVSROOT}"/>
    <property name="tagname"            value="${sysenv.CVSTAG}"/>
    <property name="buidir"             value="${srcdir}"/>
    <property name="buidir.java"        value="${buidir}/${javadir}"/>
    <property name="dstdir.java"        value="${dstdir}/${javadir}"/>
    <property name="appdir"             value="${dstdir}/${classdir}"/>
    <property name="comlib"             value="${svrlib}"/>
    <property name="devlib"             value="${sysenv.srclib}"/>

    <path id="compile.classpath">
        <fileset dir="${devlib}">
            <include name="*.jar"/>
        </fileset>
        <fileset dir="${comlib}">
            <include name="*.jar"/>
        </fileset>
        <pathelement path="${wwwdir}/${classdir}"/>
    </path>

    <target name="all"  depends="clean,init,copy,compile,deploy"/>

    <target name="init" depends="">
        <mkdir dir="${dstdir}"/>
        <mkdir dir="${depdir}"/>
        <mkdir dir="${appdir}"/>
    </target>

    <target name="compile" depends="init" description="Compile main source tree java files">
        <javac srcdir="${buidir.java}" destdir="${appdir}" debug="true" deprecation="false" optimize="false" failonerror="true" encoding="gb2312">
            <classpath refid="compile.classpath"/>
        </javac>
    </target>

    <target name="clean" depends="clndst,clndep" description="Clean output directories"/>

    <target name="clnclass" depends="" description="Clean out class files">
        <delete>
                <fileset dir="${srcdir}">
                        <include name="**/*.class"/>
                </fileset>
        </delete>
    </target>

    <target name="clnjava" depends="" description="Clean out source code file">
        <delete>
                <fileset dir="${dstdir}/${javadir}">
                        <include name="**/*.java"/>
                </fileset>
        </delete>
    </target>


    <target name="clndst" depends="" description="Clean out dest directorie">
        <delete dir="${dstdir}"/>
    </target>

    <target name="clndep" depends="" description="Clean out deploy directories">
        <delete>
        <fileset dir="${depdir}">
                <include name="*.tar"/>
        </fileset>
        </delete>
    </target>

    <target name="copy" depends="init" description="Copy web files">
        <copydir src="${buidir}" dest="${dstdir}"/>
        <copy todir="${appdir}">
                    <fileset dir="${buidir.java}">
                        <include name="**/*.xml"/>
                        <include name="**/*.properties"/>
                </fileset>
          </copy>
        <!--delete dir="${dstdir.java}"/-->
    </target>

    <target name="deploy" depends="init" description="Create web tar file">
        <tar destfile="${depdir}/${proname}-${tagname}.tar" basedir="${dstdir}"/>
    </target>

    <target name="cvsexp" depends="" description="cvs export scode from CVS lib to srcdir">
        <mkdir dir="${srcdir}"/>
        <!--<cvspass cvsroot="${svshome}"/>-->
        <cvs command="export" tag="${tagname}" failOnError="true" cvsroot="${cvshome}" package="web/impl" dest="${srcdir}"/>
    </target>
</project>'
return 0
}

echocfg()
{
echo '#The config file of depweb.sh and build.xml

# Must set the value of "CVSROOT" environment variable
CVSROOT=

# Must set the module name of project in CVS Repository
MODULE_NAME=

# Must set the "$module" source code path relative to \$CVSROOT
SRC_PATH=

# Must set the java files path relative to \$SRC_HOME
javadir=

# Must set the class files path relative to \$DST_HOME
classdir=

# Must set the jars path relative to \$SRC_PATH
srclib=

# Set the absolute common lib path
svrlib=
'
return 0
}

cmpdir()
{
echo '
#!/bin/sh
cmp_dir()
{
RET=0
cd $HOME_DIR
DIFF_NAME=$HOME_DIR/diff.err
EXIST_NAME=$HOME_DIR/$3.exist.err
>$EXIST_NAME
>$DIFF_NAME
if [ ! -d $1 ]
then
        echo directory $1 does not exit!
        exit 1
fi
if [ ! -d $2 ]
then
        echo directory $2 does not exit!
        exit 2
fi

cd $1
for i in `find . -type f ! -path "*\ *"`
do
        if [ -f $2/$i ]
        then
                cmp $1/$i $2/$i >/dev/null 2>/dev/null
                if [ $? -ne 0 ]
                then
                        #echo $1/$i
                        RET=1
                        echo $i >>$DIFF_NAME
                fi
        else
                #echo $HOME_DIR/$2/$i >>$EXIST_NAME
                #echo $i
                RET=1
                echo $i >>$EXIST_NAME

        fi
done
cd $HOME_DIR
return $RET
}

HOME_DIR=`pwd`
if [ $# -ne 2 ]
then
        echo "Usage: `basename $0` 目录1 目录2"
        exit -1
fi

DIR_1=$1
DIR_2=$2

if [ `expr substr $1 1 1` != "/" ]
then
        DIR_1="$HOME_DIR""/""$1"
fi

if [ `expr substr $2 1 1` != "/" ]
then
        DIR_2="$HOME_DIR""/""$2"
fi

#echo 第一个目录
cmp_dir $DIR_1 $DIR_2 1
RET1=$?
#echo 第二个目录
cmp_dir $DIR_2 $DIR_1 2
RET2=$?

RET=0
cd $HOME_DIR
if [ $RET1 -ne 0 -o $RET2 -ne 0 ]
then
        echo "不同"
        ls -l 1.exist.err 2.exist.err diff.err
        RET=1
fi

exit $RET'
return 0
}

#check environment

if [ -z $JAVA_HOME ]
then
    echo "Environment is wrong,please check the environment!"
    exit 1
fi

if [ -z $CVSROOT ]
then
    echo "The CVSROOT environment variable isn't setted"
    #exit 1
fi

if [ ! `which cvs` ]
then
    echo "The cvs command is not setted in \$PATH or cvs isn't installed!"
    echo "Please check the environment or installed"
    exit 1
fi

if [ ! `which ant` ]
then
    echo "The ant isn't installed"
    echo "Please install the ant"
    exit 1
fi
if [ ! `which cmp_dir` ]
then
        if [ ! -d $HOME/bin ]
        then
                mkdir -p $HOME/bin
        fi
        cmpdir >$HOME/bin/cmp_dir
        chmod +x $HOME/bin/cmp_dir
        export PATH=$HOME/bin:.:$PATH
fi

PROG=`basename $0`
ARGV="$@"
ARGC="$#"

export DATE=`date +%Y%m%d`
if [ `uname` = Linux ]
then
        export LANG=zh_CN.GB2312
elif [ `uname` = HP-UX ]
then
        export LANG=zh_CN.hp15CN
else
        LANG=`echo $LANG`
fi

if [ $ARGC -lt 1 -o $ARGC -gt 3 ]
then
        usage;exit 1;
fi

if [ `uname` = Linux ]
then
        OPTS=`getopt -n 'depweb.sh' -o haic -l help,add,initial,complete -- "$@"`
else
        OPTS=`getopt haic: $*`
fi
       
if [ $? -ne 0 ]
then
        echo "Please use $PROG -h"
        exit 1
fi
#eval set -- "$OPTS"
for args in $OPTS
do
          case "$args" in
                   -h|--help)               
                        if [ $ARGC -ne 1 ]
                        then
                                usage "HELP";exit 1; # Help requested
                        fi
                        usage;exit 0;;
                   -a|--add)               
                        if [ $ARGC -ne 3 ]
                        then
                                usage;exit 1;
                        fi
                        export CVSTAG=$2
                        export MODULE=$3
                        BUD_CFG="$HOME/build/"$MODULE"-build.properties"   
                        if [ ! -f "$BUD_CFG" ]                             
                        then                                               
                                echo "Please initial the $MODULE"         
                                echo "Please use: "depweb.sh -i <$MODULE>""
                                exit 1                                    
                        fi                                                
                        FLAG="add";
                        break;;
                        #shift;;        #add files deploy
                   -i|--initial)       
                        if [ $ARGC -ne 2 ]
                        then
                                usage;exit 1;
                        fi
                        if [ ! `which vi` ]
                        then
                                echo "Not install vim"
                                exit 1
                        fi
                        export MODULE="$2"
                        BUD_CFG="$HOME/build/"$MODULE"-build.properties"
                        if [ ! -f "$BUD_CFG" ]
                        then
                                if [ ! -d $HOME/build ]
                                then
                                        mkdir -p $HOME/build
                                fi
                                echocfg>"$BUD_CFG"
                        fi
                        setsample;
                        echo "********************************************"
                        echo "Please set the properties file"
                        sleep 3
                        vi "$BUD_CFG"
                        exit 0 ;;
                        #break;;
                        #shift;;         #increase files deploy
                   -c|--complete)        
                        if [ $ARGC -ne 3 ]
                        then
                                usage;exit 1;
                        fi
                        export CVSTAG=$2
                        export MODULE=$3
                        BUD_CFG="$HOME/build/"$MODULE"-build.properties"     
                          if [ ! -f "$BUD_CFG" ]                             
                          then                                               
                                  echo "Please initial the $MODULE"         
                                  echo "Please use: "depweb.sh -i <$MODULE>""
                                  exit 1                                    
                          fi                                                
                        FLAG="complete";
                        break;;
                        #shift;;         # complete files deploy
                   --)                        
                        if [ $ARGC -ne 2 ]
                        then
                                usage
                                exit 1
                        fi
                        export CVSTAG=$1
                        export MODULE=$2
                        FLAG="cmpold"
                        break;;
                        #shift; break;;
                   *)                 
                        usage; exit 1 ;;
          esac
done

#init part

rm -rf $HOME/build/src

if [ ! -d $HOME/bin/tmpdir ]
then
    mkdir -p $HOME/bin/tmpdir
fi
if [ ! -d $HOME/build ]
then
    mkdir -p $HOME/build
fi
if [ ! -d $HOME/build/src ]
then
    mkdir -p $HOME/build/src
fi
if [ ! -d $HOME/build/dest ]
then
    mkdir -p $HOME/build/dest
fi
if [ ! -d $HOME/build/deploy ]
then
    mkdir -p $HOME/build/deploy
fi
if [ ! -d $HOME/deploy ]
then
    mkdir -p $HOME/deploy
fi

export SRC_HOME=$HOME/build/src
export DST_HOME=$HOME/build/dest
export DEP_HOME=$HOME/build/deploy
export WWW_HOME=$HOME/build/deploy/$MODULE

BUD_XML="$HOME/build/build.xml"

if [ ! -f "$BUD_XML" ]
then
        touch $BUD_XML
        echoxml >$BUD_XML
fi

BUD_CFG="$HOME/build/"$MODULE"-build.properties"

if [ ! -f "$BUD_CFG" ]
then
        echo "The $MODULE has not been initialed!"
        echo "Please use: "depweb.sh -i \<$MODULE\>" to initial the \<$MODULE\> module"
        exit 1
fi

export CVSROOT=`grep "CVSROOT=" "$BUD_CFG"|awk -F = '{print $2}'`

SRCPATH=`grep "SRC_PATH=" "$BUD_CFG"|awk -F = '{print $2}'`

if [ ! "$SRCPATH" ]
then
            echo "Not appoint the path of source code in the $DEP_CFG"
        setsample
            exit 1
fi

CONFLST=`cat $HOME/build/config.lst`
DEPFILE=""$MODULE"-"$CVSTAG".tar"
JAVADIR=`grep -w javadir "$BUD_CFG"|awk -F = '{print $2}'`
SRCLIB=`grep -w srclib "$BUD_CFG"|awk -F = '{print $2}'`

#========================build part========================#
echo "cvs login"
cvs login
echo "cd $HOME/build"
cd $HOME/build
echo "cvs -q export -r "$CVSTAG" -d src "$SRCPATH""
cvs -q export -r "$CVSTAG" -d src "$SRCPATH"
if [ $? -ne 0 ]
then
    echo "cvs export scode failed!"
    exit 1
fi

ant clean
if [ $? -ne 0 ]
then
    echo "ant clean target have error!"
    exit 1
fi

ant clnclass

ant copy
if [ $? -ne 0 ]
then
    echo "ant copy target have error!"
    exit 1
fi

ant clnjava

if [ $FLAG = "cmpold" ]
then
    export srclib=$SRC_HOME/$SRCLIB
    TARNAME="$MODULE"-"$CVSTAG"-add.tar
    if [ -d $SRC_HOME/$JAVADIR ]
    then
        ant compile
        if [ $? -ne 0 ]
        then
                echo "ant compile target have error"
                exit 1
        fi
    fi
   
    cd $DST_HOME

    for i in $CONFLST
    do
      find . -type f -name "$i" -exec rm -f {} \;
    done
   
    tar cf "$DEPFILE" *
    mv "$DEPFILE" "$DEP_HOME"

#========================package part========================#
    cd $DEP_HOME
    rm -rf "$MODULE"-dep
    mkdir -p "$MODULE"-dep
    cp "$DEPFILE" $DEP_HOME/"$MODULE"-dep
    cd "$MODULE"-dep
    tar xf "$DEPFILE"
    rm -f "$DEPFILE"
    cd $DEP_HOME

    cmp_dir "$MODULE" "$MODULE"-dep
    if [ $? -ne 1 ]
    then
        echo "#########################################"
        echo "This version tag is the same to last tag!"
        echo "Please check whether this tag is the same to the last one!"
        exit 1
    fi

    cd "$MODULE"-dep
    tar cf "$TARNAME" `cat ../2.exist.err`
    if [ -s $TARNAME ]
    then
            tar uf "$TARNAME" `cat ../diff.err`
    else
        tar cf "$TARNAME" `cat ../diff.err`
        if [ $? -ne 0 ]
        then
                echo "$TARNAME is not created !"
                exit 1
        fi
    fi
    rm -rf $HOME/deploy/*
    mv "$TARNAME" $HOME/deploy
    cd $WWW_HOME
    cp $HOME/deploy/"$TARNAME" $WWW_HOME
    tar xf "$TARNAME"
    rm -f "$TARNAME"
    echo "The add tar is created successfully!"
    ls -ltr $HOME/deploy/"$TARNAME"
elif [ $FLAG = "complete" ]
then
    export srclib=$SRC_HOME/$SRCLIB
    TARNAME="$MODULE"-"$CVSTAG".tar
    if [ -d $SRC_HOME/$JAVADIR ]
    then
        ant compile
        if [ $? -ne 0 ]
        then
                echo "ant compile target have error"
                exit 1
        fi
    fi

    cd $DST_HOME
    tar cf "$TARNAME" *
    mv "$TARNAME" "$DEP_HOME"
    rm -rf $HOME/deploy/*
    cp $DEP_HOME/"$TARNAME" $HOME/deploy
    cd $HOME/build/deploy
    rm -rf $MODULE
    mkdir -p $MODULE
    mv "$TARNAME" $MODULE
    cd $MODULE
    tar xf "$TARNAME"
    rm -f "$TARNAME"
    echo "The whole tar is created successfully!"
    ls -ltr $HOME/deploy/"$TARNAME"
elif [ $FLAG = "add" ]
then
    export srclib=$WWW_HOME/$SRCLIB
    TARNAME="$MODULE"-"$CVSTAG"-add.tar
    if [ -d $SRC_HOME/$JAVADIR ]
    then
            ant compile
        if [ $? -ne 0 ]
        then
                echo "ant compile target have error"
                exit 1
        fi
    fi
    cd $DST_HOME
    tar cf "$TARNAME" *
    mv "$TARNAME" "$DEP_HOME"
    cp "$DEP_HOME"/"$TARNAME" "$DEP_HOME"/"$MODULE"
    rm -rf $HOME/deploy/*
    cp "$DEP_HOME"/"$TARNAME" $HOME/deploy
    cd "$DEP_HOME"/"$MODULE"
    tar xf "$TARNAME"
    rm -f "$DEP_HOME"/"$MODULE"/"$TARNAME"
    echo "The add tar is created successfully!"
    ls -ltr $HOME/deploy/"$TARNAME"
else
    usage;exit 1;
fi[/code]

SCM_Jane 2007-3-30 09:46

::em60::
(虽然我还没怎么看懂)
楼主真是无私!
向楼主学习呀!

懂你 2007-3-30 10:01

希望楼主能简单介绍一下这个脚本的背景,怎么写的?
不然看着晕,不明白。

ronstar 2007-3-31 02:24

其实这个脚本的核心还是那个build.xml,如果抛却这些shell语句,就是一个java编译的build.xml而已,只是修改一下这个build.xml掉用的properties配置文件,修改其中的参数就可以实现对不同的java项目的编译,因为java项目的核心就是对java代码的编译,只要不脱离这个核心其他的都是辅助的,比如你的项目是基于web的项目,他就会把你相应的jsp、xsl、xml以及jpg等文件,按照定义好的目录结构拷贝到同一目录下打包,毕竟基于java的web项目大都逃离不了WEB-ROOT WEB-INF/classes WEB-INF/lib等这样的目录结构嘛,如果是java应用程序,就会把编译好的class直接复制到例如bin lib这样的目录结构,统一打包,这是我根据我所接触的项目不断总结的,也许还有很多模式我没有接触到没有考虑到。
这个脚本还有一个可以单独独立出来的功能就是cmp_dir函数,这个函数的功能是实现了对两个目录进行比较的功能,最后的输出是3个文件列表,第一个文件列表是在执行cmp_dir dir1 dir2时,dir1目录比dir2目录多出的文件列表,这个文件里列出的文件名只存在于dir1目录,第二个文件列表是dir2目录比dir1目录多出的文件列表,这个文件里列出的文件名只存在于dir2目录,第三个文件列表是dir1和dir2目录里都存在但是文件内容不同的文件列表。
这个shell的主要流程是:
1.根据代码版本标签(基线标签)取出代码
2.对取出的代码进行编译和其他处理(其他处理主要是指拷贝、删除源代码、按要求建立目录结构等)
3.对构建结果进行打包封装
其中的细节设计到了公司的流程(特殊要求),比如进行版本3和版本2(或者版本1)比较的功能,主要是给出最新版本和上一版本的变更文件清单,部署的时候可以采取全量部署和增量部署两种选择,因为可以根据需要生成全量包或者增量包,增量包里面的文件就是这两个版本变更的文件,顺便可以做一下变更确认达到减少出错几率的目的,即可以确定我部署上去的文件会整个系统会有什么影响,这个流程并不是适合每个公司每个项目,所以最核心最能共用的部分还是那个build.xml,把它从脚本里剥离出来,只要稍加更改就可以实现对大多数的java项目进行构建。

[[i] 本帖最后由 ronstar 于 2007-3-31 02:27 编辑 [/i]]

懂你 2007-3-31 10:00

回复 #4 ronstar 的帖子

楼主的精神可嘉,凌辰2:27还在写这个构建打包脚本的说明.

希望论坛涌现更多这样的原创精品,并把你的思路与别人去分享.

redlechj 2007-4-8 02:00

楼主有没有VC项目的角本可以学习的啊

楼主有没有VC项目的角本可以学习的啊

zhuanghuajunmi 2007-4-30 14:09

谢谢楼主的经验分享!学习学习!

我准备在VC环境下实现自动构建!学习中……

fush 2007-5-14 16:51

楼主是forlink的liurs??
我是forlink的fush,没想到在这儿可以遇到你

bin800 2007-5-20 21:35

对楼主的这种经验丰富的scm表示钦佩,对楼主的这种热情所感动。

一看就是好东西,现拷贝下来学习一下。感觉根有难度!

lodestar51 2007-5-25 11:18

这个只能在*IX上用吧?不知道这个可不可以用ANT来实现呢?
我看楼主用到ANT,为什么不全用ANT呢?为什么还用SHELL呢?

ronstar 2007-5-28 00:16

回复 #8 fush 的帖子

呵呵,我也没想到在这里能遇见你,你现在还好吧?工作还顺心吧,很久没有MSN联系了。

ronstar 2007-5-28 00:25

回复 #10 lodestar51 的帖子

这个脚本的确是只能运行在UNIX/Linux环境,可以全用ant来实现脚本中的功能,但是我自己感觉用ant不是很自由,而且约束比较大一点,可能是我用shell习惯了,这个可以根据实际情况和个人情况而定。

ronstar 2007-5-28 00:28

回复 #6 redlechj 的帖子

VC用bat实现,主要是知道vc的命令提示符下的构建命令及其用法,我知道.net下的命令提示符下的构建命令,你把在windows下用VC构建的流程说一下,我帮你参考一下。

rrrttt 2007-7-23 16:58

好是好,可惜看不懂!

CMStruggling 2008-5-9 19:27

脚本只能运行在UNIX/Linux下啊,
没有运行在Windows下的么;
太可惜了!!

zhangwh6882 2008-5-11 00:10

同意楼上的,请楼主介绍一下为什么需要用shell来实现?
页: [1]
查看完整版本: 本人在前公司写的java项目构建打包脚本