坚持自己写工具,不管是构建还是测试打包上传更新.就是不用复杂的东西来解决简单的问题
#!/bin/bash
########################################################
### java project builder tools ###
### 自制java unix shell环境下build工具 ###
### create date 2009-04-02 ###
### last modify 2009-07-23 ###
### version 1.2.5 ###
########################################################
##log级别定义
DEBUG_LEVEL_INFO=1
DEBUG_LEVEL_DEBUG=2
DEBUG_LEVEL_WARN=3
DEBUG_LEVEL_ERROR=4
##########################################################################################################################################
## 项目定义部分 开始 ##
##########################################################################################################################################
###############################################
## 定义项目基本结构 (必要) ##
###############################################
## 项目的名字
PROJECT_NAME=ezweb-core
## 项目的版本号
PROJECT_VERSION=2.0
## 定义项目路径
PROJECT_HOME=.
## 定义源代码根路径
JAVA_SRC_DIR=$PROJECT_HOME/src
## 定义测试源代码根路径
JAVA_TEST_SRC_DIR=$PROJECT_HOME/test
## 定义jar包输出路径
JAVA_PACKAGE_TARGET_DIR=$PROJECT_HOME/target
## 定义测试输出路径
JAVA_TEST_TARGET_DIR=$PROJECT_HOME/target/classes
## 定义编译输出路径
DEST_BIN_OUTPUT_DIR=$PROJECT_HOME/bin
## 定义api文档输出路径
JAVA_DOC_OUTPUT_DIR=$PROJECT_HOME/docs
## 定义编译输出路径
DEP_LIB_DIR=$PROJECT_HOME/lib
## 定义log目录
BUILD_LOG_OUTPUT_DIR=$PROJECT_HOME/log
## 定义运行的log级别
DEBUG_LEVEL=1
###############################################
## 定义项目构建任务 (可选) ##
###############################################
## 定义默认的任务 init_env , clear , compile , copy_resources_files, default_build, java_doc
## 默认的任务default_build 编译项目,拷贝资源文件到输出路径
DEFAULT_RUN_TASK_NAME="default_build"
## 定义需要执行的java类
#RUN_JAVA_CLASS_NAME=com.ergal.ezweb.core.AllTest
## 定义需要执行的java类 的参数
#RUN_JAVA_ARGUMENTS=arg0
###############################################
## 定义java运行环境和参数(必要) ##
###############################################
## 定义java jdk所在的根目录
JAVA_HOME=/opt/sun-jdk-1.6.0.13
## 定义java运行时的内存参数
JAVA_OPTS="-Xms64m -Xmx256m"
## PATH
PATH=$JAVA_HOME/bin:$PATH
## CLASSPATH 当然包含 编译好的工程的包
CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:"$DEST_BIN_OUTPUT_DIR/":"$JAVA_TEST_TARGET_DIR/":"$JAVA_SRC_DIR"
## 系统的字符编码
export LANG=zh_CN.UTF-8
## 任务执行的时候的锁
BUILD_TASK_LOCK_DIR=$PROJECT_HOME/.lock
###############################################
## 接收和定义命令行传来的参数 ##
###############################################
## 定义个数组来储存参数
declare -a para_args_array
## 定义参数下标
args_index=1
for arg in "$@"
do
para_args_array[$args_index]=$arg
let "args_index+=1"
done
##########################################################################################################################################
## 项目定义部分 结束 ##
##########################################################################################################################################
##########################################################################################################################################
## 主要build任务函数 开始 ##
##########################################################################################################################################
###############################################
## 初始化环境变量CLASSPATH ##
###############################################
init_env()
{
build_log_task "launch initialize task"
## 进入项目目录
cd $PROJECT_HOME
## 把lib里的jar包加入到CLASSPATH里
for jar in `ls $DEP_LIB_DIR/*.jar`
do
CLASSPATH="$CLASSPATH:""$jar"
done
build_log_output_info "JAVA_HOME" "$JAVA_HOME"
build_log_output_info "CLASSPATH" "$CLASSPATH"
build_log_output_info "PATH" "$PATH"
}
###############################################
## 清空编译目录 ##
###############################################
clear()
{
build_log_task "launch clear task"
# 源代码输出目录
if [ -e $DEST_BIN_OUTPUT_DIR ] ; then
rm -rf "$DEST_BIN_OUTPUT_DIR"
mkdir -p "$DEST_BIN_OUTPUT_DIR"
else
mkdir -p "$DEST_BIN_OUTPUT_DIR"
fi
# 测试代码输出目录
if [ -e $JAVA_TEST_TARGET_DIR ] ; then
rm -rf "$JAVA_TEST_TARGET_DIR"
mkdir -p "$JAVA_TEST_TARGET_DIR"
else
mkdir -p "$JAVA_TEST_TARGET_DIR"
fi
}
###############################################
## 编译java源文件 ##
###############################################
compile()
{
# 先清空目录
clear
# 初始化环境
init_env
build_log_task "launch compile task"
# 初始化一个数组储存存放java源文件的所有的文件夹
declare -a java_source_folder_array
folder_number=0
# 循环查找所有java文件
for java_source_name in ` find $JAVA_SRC_DIR/ -type f -name '*.java' `
do
# 去掉java的文件名和/ 剩下就是文件夹路径 比如 "./src/com/google/inject"
java_sources_forlder_name=${java_source_name%/*.java}
# 判断数组里是否含有此文件夹
has_it_flag=0
for i in ${#java_source_folder_array[@]}
do
if [ "${java_source_folder_array[$i]}" = "$java_sources_forlder_name" ] ; then
has_it_flag=1
elif [ "$java_sources_forlder_name" = "$JAVA_SRC_DIR/" ] ; then
has_it_flag=1
fi
done
# 如果没有此文件夹 加数组里
if [ "$has_it_flag" = 0 ] ; then
let "folder_number+=1"
java_source_folder_array[$folder_number]="$java_sources_forlder_name"
fi
done
build_log_task "start to compile java source ......"
build_log_output_info "total package count " "$[folder_number]"
build_log_output_info "total java source count " ` find $JAVA_SRC_DIR/ -name *.java |wc -l `
# 得到所有的java 源文件
java_source_files=""
for (( a=1 ; a <= $[folder_number] ; a++ ))
do
java_source_files="$java_source_files ""${java_source_folder_array[$a]}""/*.java"
done
# 编译源文件到指定的目录
javac -encoding "UTF-8" -nowarn -d $DEST_BIN_OUTPUT_DIR $java_source_files
build_log_output_info "total class file count " ` find $DEST_BIN_OUTPUT_DIR/ -name *.class |wc -l `
}
###############################################
## 编译test源文件 ##
###############################################
compile_test()
{
build_log_task "launch compile test task"
# 初始化一个数组储存存放java源文件的所有的文件夹
declare -a java_source_folder_array
folder_number=0
# 循环查找所有java文件
for java_source_name in ` find $JAVA_TEST_SRC_DIR/ -type f -name '*.java' `
do
# 去掉java的文件名和/ 剩下就是文件夹路径 比如 "./src/com/google/inject"
java_sources_forlder_name=${java_source_name%/*.java}
# 判断数组里是否含有此文件夹
has_it_flag=0
for i in ${#java_source_folder_array[@]}
do
if [ "${java_source_folder_array[$i]}" = "$java_sources_forlder_name" ] ; then
has_it_flag=1
elif [ "$java_sources_forlder_name" = "$JAVA_TEST_SRC_DIR/" ] ; then
has_it_flag=1
fi
done
# 如果没有此文件夹 加数组里
if [ "$has_it_flag" = 0 ] ; then
let "folder_number+=1"
java_source_folder_array[$folder_number]="$java_sources_forlder_name"
fi
done
build_log_task "start to compile java source ......"
build_log_output_info "total test package count " "$[folder_number]"
build_log_output_info "total java test source count " ` find $JAVA_TEST_SRC_DIR/ -name *.java |wc -l `
# 得到所有的java 源文件
java_source_files=""
for (( a=1 ; a <= $[folder_number] ; a++ ))
do
java_source_files="$java_source_files ""${java_source_folder_array[$a]}""/*.java"
done
# 编译源文件到指定的目录
javac -encoding "UTF-8" -nowarn -d $JAVA_TEST_TARGET_DIR $java_source_files
build_log_output_info "total test class file count " ` find $JAVA_TEST_TARGET_DIR/ -name *.class |wc -l `
}
###############################################
## 运行单元测试 ##
###############################################
java_test()
{
build_log_task "start to run java junit test!!!"
# 在java测试源文件目录 查找所有java文件并循环出来
for java_source_name in ` find $JAVA_TEST_SRC_DIR/ -type f -name '*.java' `
do
# 去掉文件夹名
java_test_source_file_name=${java_source_name#"$JAVA_TEST_SRC_DIR/"}
# 去掉.java
java_test_source_class_name=${java_test_source_file_name%.java}
# 把com/ohergal/guice/test/TestGuiceMain.java 去掉斜线 换成. 变成com.ohergal.guice.test.TestGuiceMain
java_test_class=${java_test_source_class_name/.}
# 测试
java org.junit.runner.JUnitCore $java_test_class
done
}
###############################################
## 生成javadoc ##
###############################################
java_doc()
{
#初始化java环境
init_env
build_log_task "launch javadoc task"
# 清空目录 并重建
if [ -e $JAVA_DOC_OUTPUT_DIR ] ; then
rm -rf "$JAVA_DOC_OUTPUT_DIR"
mkdir "$JAVA_DOC_OUTPUT_DIR"
else
mkdir "$JAVA_DOC_OUTPUT_DIR"
fi
# 初始化一个数组储存存放java源文件的所有的文件夹
declare -a java_source_folder_array
folder_number=0
# 循环查找所有java文件
for java_source_name in ` find $JAVA_SRC_DIR/ -type f -name '*.java' `
do
# 去掉java的文件名和/ 剩下就是文件夹路径 比如 "./src/com/google/inject"
java_sources_forlder_name=${java_source_name%/*.java}
# 判断数组里是否含有此文件夹
has_it_flag=0
for i in ${#java_source_folder_array[@]}
do
if [ "${java_source_folder_array[$i]}" = "$java_sources_forlder_name" ] ; then
has_it_flag=1
elif [ "$java_sources_forlder_name" = "$JAVA_SRC_DIR/" ] ; then
has_it_flag=1
fi
done
# 如果没有此文件夹 加数组里
if [ "$has_it_flag" = 0 ] ; then
let "folder_number+=1"
java_source_folder_array[$folder_number]="$java_sources_forlder_name"
fi
done
# 得到所有的java 源文件的包
java_source_files=""
for (( a=1 ; a <= $[folder_number] ; a++ ))
do
java_source_files="$java_source_files ""${java_source_folder_array[$a]}""/*.java"
done
# 生成文档api
build_log_output_info "all the java packages " "$java_source_files"
javadoc -encoding UTF-8 -charset UTF-8 -d $JAVA_DOC_OUTPUT_DIR -sourcepath $java_source_files
}
###############################################
## 打jar包 ##
###############################################
jar_package()
{
build_log_task "launch jar task"
# 定义jar包路径和名字
package_name=$PROJECT_NAME"-"$PROJECT_VERSION".jar"
if [ -e $package_name ] ; then
rm -rf $package_name
fi
jar -cf $JAVA_PACKAGE_TARGET_DIR/$package_name -C $DEST_BIN_OUTPUT_DIR .
build_log_output_info "create a packge" "$JAVA_PACKAGE_TARGET_DIR/$package_name"
}
###############################################
## 拷贝所有项目源代码里的配置文件和资源文件 ##
###############################################
copy_resources_files()
{
build_log_task "launch copy resource file task"
for resources_file_name in `find $JAVA_SRC_DIR/ /( -type f -name '**.java*' -o -type d -o -path '*.svn*' /) -o -print`
do
# 去掉前缀的路径 不包含所在的项目下的源文件路径
resource_file_name_nsp=${resources_file_name#"$JAVA_SRC_DIR/"}
build_log_output_info "copy resource file " $resource_file_name_nsp
# 拷贝到编译输出目录中
cp -fu $resources_file_name "$DEST_BIN_OUTPUT_DIR""/$resource_file_name_nsp"
# 拷贝到测试输出目录中
cp -fu $resources_file_name "$JAVA_TEST_TARGET_DIR""/$resource_file_name_nsp"
done
}
###############################################
## 默认的构建方法 编译和copy资源 ##
###############################################
default_build()
{
compile
compile_test
copy_resources_files
java_test
#jar_package
}
##########################################################################################################################################
## 主要build任务函数 结束 ##
##########################################################################################################################################
##########################################################################################################################################
## 脚本工具函数部分 开始 ##
##########################################################################################################################################
###############################################
## 输出调试信息的方法 ##
###############################################
## 打印提示信息标题 1个参数 标题信息
build_log_title()
{
if (( DEBUG_LEVEL <= DEBUG_LEVEL_DEBUG )) ; then
if [[ ! -z $1 ]] ; then
echo -e '/E[31;48m'"/033[1m **************************** $1 **************************** /033[0m"
fi
fi
}
## 输出调试变量信息 2个参数 参数名 和参数值
build_log_output_info()
{
if (( DEBUG_LEVEL <= DEBUG_LEVEL_DEBUG )) ; then
if [[ ! -z $1 && ! -z $2 ]] ; then
echo -e '/E[32;48m'"/033[1m $1 : /033[0m" $2
fi
fi
}
## 打印提示信息标题 1个参数 标题信息
build_log_task()
{
if (( DEBUG_LEVEL <= DEBUG_LEVEL_DEBUG )) ; then
if [[ ! -z $1 ]] ; then
echo -e '/E[33;48m'"/033[1m $1 /033[0m"
fi
fi
}
## 打印错误提示信息
build_log_error()
{
if [[ ! -z $1 ]] ; then
echo -e '/E[31;48m'"/033[1m $1 /033[0m"
fi
}
###############################################
## 锁住任务方法 ##
###############################################
lock_build_task()
{
# 任务名称
task_name=$1
# 如果不存在.lock文件夹 先创建文件夹
if [ ! -e $BUILD_TASK_LOCK_DIR ] ; then
mkdir "$BUILD_TASK_LOCK_DIR"
fi
# 检查是否有任务执行
if [[ -z $task_name ]] ; then
build_log_error "no task run !! please check it!!!"
return 2
else
# 有任务名 那么检查此任务是否在进行中 如果在 返回错误 如果不在进行中 加锁 并开始执行
task_lock_file="$BUILD_TASK_LOCK_DIR"/"$task_name"
if [ -e $task_lock_file ] ; then
build_log_error "the last $task_name is running !! please wait!!!"
return 1
else
touch $task_lock_file
return 0
fi
fi
}
###############################################
## 任务解锁方法 ##
###############################################
unlock_build_task()
{
# 任务名称
task_name=$1
# 如果不存在.lock文件夹 先创建文件夹
if [ ! -e $BUILD_TASK_LOCK_DIR ] ; then
mkdir "$BUILD_TASK_LOCK_DIR"
fi
# 检查是否有任务执行
if [[ -z $task_name ]] ; then
build_log_error "no task run !! please check it!!!"
return 2
else
# 有任务名 如果存在锁 删除锁
task_lock_file="$BUILD_TASK_LOCK_DIR"/"$task_name"
if [ -e $task_lock_file ] ; then
rm -rf $task_lock_file
return 0
else
build_log_error "no task lock will be unlock !! please check it!!!"
return 1
fi
fi
}
###############################################
## 检查执行任务合法性方法 ##
###############################################
check_build_task()
{
if [[ $1 = "default_build" ]] ; then
return 0
elif [[ $1 = "compile" ]] ; then
return 0
elif [[ $1 = "copy_resources_files" ]] ; then
return 0
elif [[ $1 = "clear" ]] ; then
return 0
elif [[ $1 = "init_env" ]] ; then
return 0
elif [[ $1 = "java_doc" ]] ; then
return 0
else
build_log_error "no task named $1 please check it!!!"
return 1
fi
}
###############################################
## 脚本的执行入口方法 ##
###############################################
start()
{
build_log_title "build $PROJECT_NAME start"
run_task=${para_args_array[1]}
# 如果没有别的参数 就直接执行配置的默认任务
if [ -z $run_task ] ; then
lock_build_task $DEFAULT_RUN_TASK_NAME
if (( $?==0 )) ; then
# 执行任务
$DEFAULT_RUN_TASK_NAME
# 解锁
unlock_build_task $DEFAULT_RUN_TASK_NAME
fi
else
# 检查任务合法性
check_build_task $run_task
if (( $?==0 )) ; then
lock_build_task $run_task
if (( $?==0 )) ; then
# 执行任务
$run_task
# 解锁
unlock_build_task $run_task
fi
fi
fi
build_log_title "build $PROJECT_NAME end"
}
##########################################################################################################################################
## 脚本工具函数部分 结束 ##
##########################################################################################################################################
###开始执行任务
start
exit 0
## 版本更新记录
## 1.2.0 重构所有结构 模块化各个任务
## 1.2.3 增加java doc
## 1.2.4 增加junit单元测试
## 1.2.5 增加jar任务
## 需要改进的地方
## 1 任务之间协调麻烦 需要有个执行状态 解决循环依赖的问题