运维自动化之java编译自动化

【详细的脚本代码如下】:

#!/bin/sh#对参数做判断if[$#-lt1];thenecho-e’\033[31m输入参数错误!\033[37m’echo-e”\033[31m例如:$0test-web\033[37m”echo-e”\033[31m例如:$0config\033[37m”exit1fi#变量的初始化PROJECT=$1JAVA_HOME=/usr/local/jdk/jrePROJECT_PATH=/home/souces/$PROJECT#源代码路径echo”$PROJECT”|grep-qservice#判断是web还是service类型SERVICEorNOT=$?JAR_PATH=$PROJECT_PATH/WebContent/WEB-INF/lib/#项目jar包路径CLASS_PATH=$PROJECT_PATH/WebContent/WEB-INF/classes/#编译好的代码,class存放路径TARGET=/home/target#编译好的代码,存放的根路径TARGET_PROPERTIES_LOCATION=”$TARGET/$PROJECT/WEB-INF/classes”#编译好之后,配置文件应该放的位置SRC_PATH=$PROJECT_PATH/src#源代码的src的路径TIME=`date+%Y%m%d%H%M%S`if[“$SERVICEorNOT”-eq0];then#如果是service类型JAR_PATH=”$PROJECT_PATH/lib/”CLASS_PATH=$PROJECT_PATH/classesTARGET_PROPERTIES_LOCATION=”$TARGET/$PROJECT”rm-rf$CLASS_PATH/*mkdir-p$CLASS_PATH/META-INFfiif[[$PROJECT!=”config”&&$PROJECT!=”config_2″]];thenJAVA_SOURCE_DIRS=`cd$SRC_PATH&&ls*/-d|sed’s/\/*$//g’`#将src下面的com等目录取出fifunctionCompile_project(){find$SRC_PATH-name*.java>$SRC_PATH/sources.list#将java的所有文件都找出forJAVA_SOURCE_DIRin$JAVA_SOURCE_DIRS;dorm-rf$CLASS_PATH/$JAVA_SOURCE_DIRmkdir-p$CLASS_PATH/$JAVA_SOURCE_DIR#将源目录class下面的com等目录创建好,否则你拷贝class文件的时候就找不到目标目录拉doneecho-e’\033[32m开始编译ing\033[37m’#最关键的就是这里拉,-classpath需要说明编译的时候使用的lib是啥,-d说明的是,编译好之后,class应该生成到哪个目录#-extdirs说明本project依赖的外部jar包情况,@就说明,需要编译的java文件列表,这就是之前为啥有爱哦findjava文件的原因#使用-XDignore.symbol.file的原因:因为使用到了sun.awt.event.*不加这个参数会报错,比较好的解决办法是让开发修改掉,不要使用这些库javac-g-XDignore.symbol.file-classpath$JAVA_HOME/lib/-d$CLASS_PATH-extdirs$JAR_PATH@”$SRC_PATH/sources.list”#service类型打jar包if[“$SERVICEorNOT”-eq0];thencd$PROJECT_PATH&&#关键,这里是生成MANIFEST.MF,MANIFEST.MF说明了jar包依赖的lib库已经主函数,so需要一下两步骤#注意这里需要用sed向每行前面添加2个空格,否则打jar包的时候会抛IOException:java.io.IOException:linetoolongecho”Class-Path:$(findlib-name’*.jar’|sed’s/lib\//lib\//g’)”>classes/META-INF/MANIFEST.MF#main函数的路径使用svn的配置文件来管理,因为开发不规范,#导致了可能java出现了多个main,所以需要开发修改这个配置文件指定main函数svnup/home/souces/config/project_maininfoMainClass=`grep$PROJECT/home/souces/config_2/project_maininfo/maininfo.properties|awk-F’=”{print$2}’`echo”Main-Class:$MainClass”>>classes/META-INF/MANIFEST.MF#其实开始的一切工作都是为了这个关键的语句,,下面就是打jar包了#”$PROJECT”.jar指定jar的名字,使用的MANIFEST是啥,-C说明classes的路径,jarcvfm”$PROJECT”.jarclasses/META-INF/MANIFEST.MF-Cclasses/.2>&1>/dev/nullfiif[$?-eq0];thenecho-e’\033[32m编译成功\033[37m’elseecho-e’\033[31m编译失败\033[37m’exit1fi#service类型拷贝jar包和libif[“$SERVICEorNOT”-eq0];then/bin/cp-rf$PROJECT_PATH/”$PROJECT”.jar$TARGET/$PROJECTrsync-a–exclude=”.svn”–delete$PROJECT_PATH/lib$TARGET/$PROJECT/libelsersync-a–exclude=”.svn”–delete$PROJECT_PATH/WebContent/*$TARGET/$PROJECTfi#需要拷贝class文件if[$?-eq0];thenecho-e”\033[32m拷贝classTo$TARGET/$PROJECT成功\033[37m”elseecho-e”\033[31m拷贝classTo$TARGET/$PROJECT失败\033[37m”fi#编译好了之后需要拷贝配置文件(properties,xml等)cd$PROJECT_PATH/src&&{forPROPERTIESin`find.-typef|grep-v’.java$’|grep-v”.svn”|grep-v’.class’`;domkdir-p`dirname$TARGET_PROPERTIES_LOCATION/$PROPERTIES`/bin/cp-f$PROPERTIES$TARGET_PROPERTIES_LOCATION/$PROPERTIESdone}if[$?-eq0];thenecho-e’\033[32m拷贝properties,config成功\033[37m’elseecho-e’\033[31m拷贝properties,config失败\033[37m’fi}#项目打包的名字把编译时间,项目的版本号加入了,用于以后好追溯这个包的svn版本号和编译时间functionproject_tgz(){cd$TARGET&&PROJECT_VERSION=$(svninfo$PROJECT_PATH|grepRevision|cut-d”-f2)TARGET_TGZ=”$PROJECT”.”$TIME”.”p_$PROJECT_VERSION”.tgztar-zcf$TARGET_TGZ$PROJECT&&mv$TARGET_TGZ/home/tgzs/echo-e”\033[32m打包$TARGET_TGZ成功\033[37m”}#项目打包的名字把编译时间,配置文件的版本号加入了,用于以后好追溯这个包的svn版本号和编译时间functionconfig_tgz(){CONFIG_2_VERSION=$(svninfo/home/souces/config_2/|grepRevision|cut-d”-f2)rsync-a–exclude=”.svn”–delete/home/souces/config_2/*/home/target/config_2TARGET_TGZ=”config_2″.”$TIME”.cfg_”$CONFIG_2_VERSION”.tgzcd$TARGET&&tar-zcf$TARGET_TGZconfig_2&&mv$TARGET_TGZ/home/tgzs/echo-e”\033[32m打包$TARGET_TGZ成功\033[37m”}#如果只更新了配置文件if[[“$PROJECT”==”config”]];thenconfig_tgz#默认编译代码和打包配置文件elseCompile_projectproject_tgzfi

本文出自 “H2O's运维&开发路” 博客,转载请与作者联系!

不能接受失败,也意味太想去成功了,从心理学上解释,

运维自动化之java编译自动化

相关文章:

你感兴趣的文章:

标签云: