首先贴出shell代码来
#!/bin/sh #BASH_SOURCE为获取执行指令 MAIN_HOME="${BASH_SOURCE-$0}" MAIN_HOME="$(dirname "${MAIN_HOME}")" MAIN_HOME="$(cd "${MAIN_HOME}"; pwd)" echo $MAIN_HOME if [ "$JAVA_HOME" != "" ]; then JAVA="$JAVA_HOME/bin/java" else JAVA=java fi #在本路径的上级目录下创建日志目录和保存进程号的目录 mkdir -p $MAIN_HOME/../logs mkdir -p $MAIN_HOME/../pid #把lib下的所有jar都加入到classpath中 for i in "$MAIN_HOME"/../lib/*.jar do echo $i CLASSPATH="$i:$CLASSPATH" done #启动类的包名 MAIN="com.test.Startup" DAEMON_OUT="$MAIN_HOME/../logs/main.out" PID_FILE="$MAIN_HOME/../pid/main.pid" CONF_PATH="$MAIN_HOME/../conf" echo $DAEMON_OUT echo $MAIN echo $PID_FILE case $1 in start) JVMFLAGS=" -Dfile.encoding=UTF-8 -Dspring.profiles.active=$2 -Xss512k -Xmx2048M -Xms2048M -Xmn512M -XX:PermSize=192M -XX:MaxPermSize=192M -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:+CMSClassUnloadingEnabled -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -Xverify:none -Xnoclassgc" #-XX:+CMSPermGenSweepingEnabled代替参数CMSClassUnloadingEnabled echo "$JVMFLAGS" echo "Starting main... " if [ -f "$PID_FILE" ]; then if kill -0 `cat "$PID_FILE"` > /dev/null 2>&1; then echo $command already running as process `cat "$PID_FILE"`. exit 0 fi fi nohup "$JAVA" -cp "$CONF_PATH":"$CLASSPATH" $JVMFLAGS $MAIN > "$DAEMON_OUT" 2>&1 < /dev/null & if [ $? -eq 0 ] then if /bin/echo -n $! > "$PID_FILE" then sleep 1 echo "STARTED" else echo "FAILED TO WRITE PID" exit 1 fi else echo "main DID NOT START" exit 1 fi ;; restart) sh $0 stop $2 sleep 3 sh $0 start $2 ;; stop) echo "Stopping main... " if [ ! -f "$PID_FILE" ] then echo "no api to started (could not find file $PID_FILE)" else kill -9 $(cat "$PID_FILE") rm "$PID_FILE" echo "STOPPED" fi exit 0 ;; *) echo "Usage: $0 {start|stop|restart} {test|onlineTest|online}" >&2 esac
先来两个简单java启动脚本写法理解一下:
第一种写法:java -cp TEST.jar -Dfile.encoding=gbk com.test.Startup CKIFPD.cfg
JVM理解成了执行一个class,即java [-options] class [args...],所以com.test.Startup后面的被当成了args;
第二种写法:java -jar TEST.jar -Dfile.encoding=gbk com.test.Startup CKIFPD.cfg
JVM理解成了执行一个jar,即java [-options] -jar jarfile [args...],所以-jar TEST.jar后面的都被当成了args。
我的shell脚本用的是第一种,其中难点是nohup和输入输出重定向那里,重定向的可以看下我的这篇文章linux输入输出重定向,还有添加了jvm优化的参数,优化参数可以参考我另外的一片调优参数的文章jvm参数
再来看看maven的pom设置
<build> <finalName>test</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.7</version> <configuration> <skip>true</skip> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-assembly-plugin</artifactId> <version>2.5.3</version> <executions> <execution> <id>make-zip</id> <phase>package</phase> <goals> <goal>single</goal> </goals> <configuration> <finalName>test</finalName> <descriptors> <descriptor>release.xml</descriptor> </descriptors> </configuration> </execution> </executions> </plugin> </plugins> </build>
release.xml配置
<?xml version="1.0" encoding="UTF-8"?> <assembly> <id>main</id> <baseDirectory>test</baseDirectory> <formats> <format>zip</format> </formats> <fileSets> <fileSet> <directory>${project.basedir}/src/main/resources/bin</directory> <outputDirectory>bin</outputDirectory> </fileSet> <fileSet> <directory>${project.basedir}/src/main/resources</directory> <outputDirectory>conf</outputDirectory> <excludes> <exclude>bin/</exclude> </excludes> </fileSet> </fileSets> <dependencySets> <dependencySet> <useProjectArtifact>true</useProjectArtifact> <outputDirectory>lib</outputDirectory> </dependencySet> </dependencySets> </assembly>