读书人

java项目构建支配包

发布时间: 2012-11-16 14:12:15 作者: rapoo

java项目构建部署包
Java 工程在生产环境运行时,一般需要构建成一个jar,同时在运行时需要把依赖的jar添加到classpath中去,如果直接运行添加classpath很不方便,比较方便的是创建一个shell脚本。在公司项目中看到把工程代码和依赖jar包合并到一块,省去设置classpath的麻烦。但这样把项目jar依赖绑定死,被其它项目引入,容易造成jar依赖冲突,如果用maven管理java项目,导致提交到公司仓库jar过于庞大,同时也失去maven对jar依赖管理的作用。
为了方便java项目部署运行,这里为构建部署包定义一个固定格式:

/java 项目
/lib --存放所有依赖jar
/conf --存放配置文件,例如:log4j, spring, properties等配置文件,不放入jar是为
了方便修改这些配置文件
/logs --运行时自动创建的目录,存放日志文件
/bin --存放运行脚本: server.sh 启动和停止项目运行。

如果在构建部署包时,需要我们手动去创建这样的目录,把文件拷贝相应目录,实在是太繁琐了,幸好maven为我们这样“懒惰”coder提供了一个很好的plugin:maven-assembly-plugin,可以去定制这样的部署结构

1:配置maven-assembly-plugin

<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><descriptor>src/main/assembly/assembly.xml</descriptor></descriptors></configuration><executions><execution><id>make-assembly</id><phase>package</phase><goals><goal>single</goal></goals></execution></executions></plugin>

2:assembly 配置打包格式,定义在assembly.xml文件中,文件中配置信息不作过多解释,可以参考相应文档
<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"><id>bin</id><formats><format>tar.gz</format></formats><dependencySets><dependencySet><useProjectArtifact>true</useProjectArtifact><outputDirectory>lib</outputDirectory><scope>runtime</scope></dependencySet></dependencySets><fileSets><fileSet><outputDirectory>/</outputDirectory><includes><include>README.txt</include></includes></fileSet><fileSet><directory>src/main/scripts</directory><outputDirectory>/bin</outputDirectory><lineEnding>unix</lineEnding><fileMode>0755</fileMode><includes><include>*.sh</include></includes></fileSet><fileSet><directory>target/classes</directory><outputDirectory>/conf</outputDirectory><includes><include>*.xml</include></includes></fileSet></fileSets></assembly>


下面这段配置主要从src/main/scripts目录获取shell脚本复制到bin目录。同时设置文件模式为unix,文件具有可执行权限。
<directory>src/main/scripts</directory><outputDirectory>/bin</outputDirectory><lineEnding>unix</lineEnding><fileMode>0755</fileMode><includes>    <include>*.sh</include></includes>


3:shell脚本
#!/bin/sh# resolve links - $0 may be a softlinkPRG="$0"while [ -h "$PRG" ]; do  ls=`ls -ld "$PRG"`  link=`expr "$ls" : '.*-> \(.*\)$'`  if expr "$link" : '/.*' > /dev/null; then    PRG="$link"  else    PRG=`dirname "$PRG"`/"$link"  fidonePRGDIR=`dirname "$PRG"`BASE_DIR=`cd "$PRGDIR/.." >/dev/null; pwd`LOG_DIR="$BASE_DIR/logs"SERVER_PID="$BASE_DIR/conf/server.pid"if [ ! -d "$LOG_DIR" ]; then    mkdir "$LOG_DIR"fiJAVA_HOME="/usr/java/jdk1.6.0_33"JAVA_OPTS="-Dcollect.shutdown.hook=true -Dcollect.log.dir=$LOG_DIR -Dcollect.server.lock=true"if [ ! -d "#JAVA_HOME" ]; then    echo "JAVA_HOME not exist"    exit 1;fiif [ "$1" = "start" ] ; then    JAVACMD="$JAVA_HOME/bin/java"CLASSPATH="$BASE_DIR/conf"for jarfile in `ls $BASE_DIR/lib/.`; do    CLASSPATH="${CLASSPATH}:$BASE_DIR/lib/$jarfile"doneecho "Using BASEDIR:       $BASE_DIR"  >> "$LOG_DIR/server.log"echo "Using CLASSPATH:     $CLASSPATH" >> "$LOG_DIR/server.log"echo "Using JAVA_HOME      $JAVA_HOME" >> "$LOG_DIR/server.log"echo "Using JAVA_OPTS:     $JAVA_OPTS" >> "$LOG_DIR/server.log"    eval \"$JAVACMD\" $JAVA_OPTS -cp \"$CLASSPATH\" com.xxx.ueap.collect.slave.Main >> "$LOG_DIR/server.log"  2>&1 "&"    echo $! > "$SERVER_PID"elif [ "$1" = "stop" ]; thenPID=`cat "$SERVER_PID"`echo "Killing collect slave server with the PID: $PID"    kill $PID   rm -f "$SERVER_PID" >/dev/null 2>&1elif [ "$1" = "restart" ]; then    $0 stop    sleep 1    $0 startelseecho "Usage: run.sh {start|stop|restart}"  fi

根据项目需要,只需要替换掉com.xxx.ueap.collect.slave.Main和JAVA_HOME变量值,也可以修改JAVA_OPTS变量值,如设置jvm 内存参数。

4:执行mvn install或者mvn package 可以再target生成tar.gz后缀文件。提交到linux系统,解压缩即可运行。(不考虑window环境)



这个域名是在hosts文件中配置的

读书人网 >软件架构设计

热点推荐