java 编译 部署_java如何部署编译自动化

为了让代码开发之后,提升测试、部署上线的效率,需要将代码编译、部署过程自动化。

这里先介绍怎样使用javac自动化编译java代码。

因为项目目前暂未使用ant、maven等管理构建,所以需要使用比较原始的javac来实现,很伤有木有。

代码目录结构

1、web类型的代码:达成war包(就一目录),使用tomcat来部署

web类型的工程目录结构介绍

# ls /home/souces/boss-web

src WebContent

src存放java的源代码:java文件,properties文件,xml文件等

WebContent存放html,js,css等文件

2、service类型的代码,最终会打成jar包部署

lib目录存放java项目依赖的jar包

src存放java的源代码:java文件,properties文件,xml文件等

ps:呃,这都是比较原始的项目结构了,后期要推动研发使用maven啊,虽然不用maven,但是作为运维,要见招拆招啊,所以也得在现有状况下给出方案滴。

3、编译目录结构梳理

/home/build/存放编译脚本:build.sh

/home/sources/存放源代码

/home/target/存放编译好的“目录”

/home/tgzs/存放编译后压缩好的tgz包

以后每次发布使用代码的tgz和config的tgz整合之后就可以发布了

test-web.20140826234520.p_3547.tgz

config_2.20140826234520.cfg_3544.tgz

其实我这里省略了对代码、配置文件的svn管理,及更新 /home/sources/的源代码的脚本,脚本就自己实现把。

详细的脚本代码如下:

#!/bin/sh

#对参数做判断if [ $# -lt 1]; then

echo-e '\033[31m输入参数错误!\033[37m'echo-e "\033[31m例如:$0 test-web\033[37m"echo-e "\033[31m例如:$0 config\033[37m"exit1fi

#变量的初始化

PROJECT=$1JAVA_HOME=/usr/local/jdk/jre

PROJECT_PATH=/home/souces/$PROJECT #源代码路径

echo"$PROJECT"|grep -q service #判断是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" -eq 0];then#如果是service类型

JAR_PATH="$PROJECT_PATH/lib/"CLASS_PATH=$PROJECT_PATH/classes

TARGET_PROPERTIES_LOCATION="$TARGET/$PROJECT"rm-rf $CLASS_PATH/*mkdir -p $CLASS_PATH/META-INF

fi

if [[ $PROJECT != "config" && $PROJECT != "config_2" ]];then

JAVA_SOURCE_DIRS=`cd $SRC_PATH && ls*/ -d|sed 's/\/*$//g'` #将src下面的com等目录取出

fi

function Compile_project(){

find $SRC_PATH-name *.java > $SRC_PATH/sources.list #将java的所有文件都找出for JAVA_SOURCE_DIR in $JAVA_SOURCE_DIRS;dorm-rf $CLASS_PATH/$JAVA_SOURCE_DIR

mkdir-p $CLASS_PATH/$JAVA_SOURCE_DIR #将源目录class下面的com等目录创建好,否则你拷贝class文件的时候就找不到目标目录拉

done

echo-e '\033[32m开始编译ing\033[37m'#最关键的就是这里拉,-classpath需要说明编译的时候使用的lib是啥,-d说明的是,编译好之后,class应该生成到哪个目录

#-extdirs说明本project依赖的外部jar包情况,@就说明,需要编译的java文件列表,这就是之前为啥有爱哦find java文件的原因

#使用-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" -eq 0];then

cd $PROJECT_PATH&关键,这里是生成MANIFEST.MF,MANIFEST.MF说明了jar包依赖的lib库已经主函数,so需要一下两步骤

#注意这里需要用sed向每行前面添加2个空格,否则打jar包的时候会抛IOException:java.io.IOException: line toolongecho"Class-Path:$(find lib -name '*.jar'|sed 's/lib\// lib\//g')" > classes/META-INF/MANIFEST.MF

#main函数的路径使用svn的配置文件来管理,因为开发不规范,

#导致了可能java出现了多个main,所以需要开发修改这个配置文件指定main函数

svn up/home/souces/config/project_maininfo

MainClass=`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的路径,

jar cvfm"$PROJECT".jar classes/META-INF/MANIFEST.MF -C classes/ . 2>&1 >/dev/nullfiif [ $? -eq 0];then

echo-e '\033[32m编译成功\033[37m'

elseecho-e '\033[31m编译失败\033[37m'exit1fi

#service类型拷贝jar包和libif [ "$SERVICEorNOT" -eq 0];then/bin/cp -rf $PROJECT_PATH/"$PROJECT".jar $TARGET/$PROJECT

rsync-a --exclude=".svn" --delete $PROJECT_PATH/lib $TARGET/$PROJECT/libelsersync-a --exclude=".svn" --delete $PROJECT_PATH/WebContent/*$TARGET/$PROJECT

fi

#需要拷贝class文件

if [ $? -eq 0 ];then

echo -e "\033[32m拷贝class To $TARGET/$PROJECT成功\033[37m"

else

echo -e "\033[31m拷贝class To $TARGET/$PROJECT失败\033[37m"

fi

#编译好了之后需要拷贝配置文件(properties,xml等)

cd $PROJECT_PATH/src &&

{

for PROPERTIES in `find . -type f|grep -v '.java$'|grep -v ".svn"|grep -v '.class'`;do

mkdir -p `dirname $TARGET_PROPERTIES_LOCATION/$PROPERTIES`

/bin/cp -f $PROPERTIES $TARGET_PROPERTIES_LOCATION/$PROPERTIES

done

}

if [ $? -eq 0 ];then

echo -e '\033[32m拷贝properties,config成功\033[37m'

else

echo -e '\033[31m拷贝properties,config失败\033[37m'

fi

}

#项目打包的名字把编译时间,项目的版本号加入了,用于以后好追溯这个包的svn版本号和编译时间

function project_tgz(){

cd $TARGET &&

PROJECT_VERSION=$(svn info $PROJECT_PATH|grep Revision|cut -d' ' -f2)

TARGET_TGZ="$PROJECT"."$TIME"."p_$PROJECT_VERSION".tgz

tar -zcf $TARGET_TGZ $PROJECT &&

mv $TARGET_TGZ /home/tgzs/

echo -e "\033[32m打包$TARGET_TGZ 成功\033[37m"

}

#项目打包的名字把编译时间,配置文件的版本号加入了,用于以后好追溯这个包的svn版本号和编译时间

function config_tgz(){

CONFIG_2_VERSION=$(svn info /home/souces/config_2/|grep Revision|cut -d' ' -f2)

rsync -a --exclude=".svn" --delete /home/souces/config_2/* /home/target/config_2

TARGET_TGZ="config_2"."$TIME".cfg_"$CONFIG_2_VERSION".tgz

cd $TARGET &&

tar -zcf $TARGET_TGZ config_2 &&

mv $TARGET_TGZ /home/tgzs/

echo -e "\033[32m打包$TARGET_TGZ 成功\033[37m"

}

#如果只更新了配置文件

if [[ "$PROJECT" == "config" ]];then

config_tgz

#默认编译代码和打包配置文件

else

Compile_project

project_tgz

fi

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值