Springboot 项目,把依赖包和开发的应用都打在一个jar 里很简单,但有个问题是,修改点东西就要再次全量更新。
这里介绍如何用assembly 来实现不打依赖包。
1、 在主模块中,需要引入 assembly.xml配置:
src/main/assembly/assembly.xml
<?xml version="1.0" encoding="UTF-8" ?>
<assemblyxmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0http://maven.apache.org/xsd/assembly-1.1.0.xsd
http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 "><!--必须写,否则打包时会有 assembly ID must be present and non-empty 错误这个名字最终会追加到打包的名字的末尾,如项目的名字为 speed-api-0.0.1-SNAPSHOT,则最终生成的包名为 speed-api-0.0.1-SNAPSHOT-bin.zip--><id>bin</id><!-- 打包后的文件格式,可以是zip,tar,tar.gz,tar.bz2,jar,war,dir --><formats><format>zip</format></formats><!-- 压缩包下是否生成和项目名相同的根目录 --><includeBaseDirectory>true</includeBaseDirectory><dependencySets><dependencySet><!-- 不使用项目的artifact,第三方jar不要解压,打包进zip文件的lib目录 --><useProjectArtifact>false</useProjectArtifact><outputDirectory>lib</outputDirectory><unpack>false</unpack></dependencySet></dependencySets><fileSets><!-- 把项目相关的说明文件,打包进zip文件的根目录 --><fileSet><directory>erp_web</directory><outputDirectory>/erp_web</outputDirectory></fileSet><fileSet><directory>${project.basedir}/target</directory><includes><include>*.jar</include></includes><outputDirectory>/lib</outputDirectory></fileSet><!-- 把项目的配置文件,打包进zip文件的config目录 --><fileSet><directory>${project.basedir}/src/main/resources</directory><includes><include>*.properties</include><include>*.yml</include><include>*.yaml</include><include>*.xml</include></includes><outputDirectory>/config</outputDirectory></fileSet><!-- 把项目的脚本文件,打包进zip文件的bin目录 --><fileSet><directory>${project.basedir}/src/main/bin</directory><outputDirectory>/bin</outputDirectory><includes><include>run-manage.sh</include></includes><lineEnding>unix</lineEnding></fileSet><fileSet><directory>${project.basedir}/src/main/bin/</directory><outputDirectory>/</outputDirectory><includes><include>start.bat</include><include>restart.sh</include><include>start.sh</include><include>stop.sh</include><include>status.sh</include></includes></fileSet><fileSet><directory>docs</directory><outputDirectory>/docs</outputDirectory></fileSet><fileSet><directory>${project.basedir}</directory><includes><include>*.md</include><include>*.txt</include></includes><outputDirectory>/</outputDirectory></fileSet><!-- 把项目自己编译出来的jar文件,打包进zip文件的根目录 --><fileSet><directory>${project.build.directory}</directory><outputDirectory></outputDirectory><includes><include>*.jar</include></includes></fileSet></fileSets>
</assembly>
pom.xml 修改build 节点:
<build><finalName>${project.artifactId}</finalName><plugins><!-- 指定启动类,将依赖打成外部jar包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><!-- 生成的jar中,不要包含pom.xml和pom.properties这两个文件 --><addMavenDescriptor>false</addMavenDescriptor><manifest><!-- 是否要把第三方jar放到manifest的classpath中 --><addClasspath>true</addClasspath><!-- 外部依赖jar包的最终位置 --><classpathPrefix>lib/</classpathPrefix><!-- 项目启动类 --><mainClass>cn.iocoder.yudao.server.YudaoServerApplication</mainClass></manifest></archive></configuration></plugin><!-- 使用assembly打包 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><configuration><descriptors><!-- assembly配置文件位置 --><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><!-- 打包发布时,跳过单元测试 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><configuration><skipTests>true</skipTests></configuration></plugin></plugins><resources><resource><directory>src/main/webapp</directory><targetPath>META-INF/resources</targetPath><includes><include>**/**</include></includes></resource></resources></build>
linux 启动shell脚本
SERVER_NAME=jdeps-shop
readonly APP_HOME=${FILE_PATH:-$(dirname $(cd `dirname $0`; pwd))}
#readonly JAVA_HOME=""
readonly CONFIG_HOME="$APP_HOME/config"
readonly LIB_HOME="$APP_HOME/lib"
readonly LOGS_HOME="$APP_HOME/logs"
readonly PID_FILE="$LOGS_HOME/application.pid"
readonly APP_MAIN="$APP_HOME/yudao-server.jar"
readonly APP_MAIN_CLASS="cn.iocoder.yudao.server.YudaoServerApplication"
readonly LOG_CONFIG="$CONFIG_HOME/logback-spring.xml"
readonly JAVA_RUN="-Dlogs.home=$LOGS_HOME -Dlogging.config=$LOG_CONFIG -Dspring.config.location=file:$CONFIG_HOME/ -Dspring.pid.file=$PID_FILE -Dspring.pid.fail-on-write-error=true"
readonly JAVA_OPTS="-server -Xms128m -Xmx320m -XX:PermSize=128M -XX:MaxPermSize=256M $JAVA_RUN"
readonly JAVA="java"
PID=0
if [ ! -x "$LOGS_HOME" ]
thenmkdir $LOGS_HOME
fi
#chmod +x -R "$JAVA_HOME/bin/"
functions="/etc/functions.sh"
if test -f $functions ; then. $functions
elsesuccess(){echo " SUCCESS! $@"}failure(){echo " ERROR! $@"}warning(){echo "WARNING! $@"}
fi
function checkpid() {PID=$(ps -ef | grep $APP_MAIN_CLASS | grep -v 'grep' | awk '{print int($2)}')if [[ -n "$PID" ]]thenreturn 0elsereturn 1fi
}
function start() {checkpidif [[ $? -eq 0 ]]thenwarning "[$APP_MAIN_CLASS]: already started! (PID=$PID)"elseecho -n "[$APP_MAIN_CLASS]: Starting ..."#nohup java -cp conf:lib/*.jar:jdeps-shop-1.0.jar com.jdeps.eshop.JdepsShopApplication > logs/jdeps.log 2>&1 &#JAVA_CMD="nohup $JAVA $JAVA_OPTS -jar $LIB_HOME/$APP_MAIN_CLASS > /dev/null 2>&1 &"JAVA_CMD="nohup $JAVA $JAVA_OPTS -cp conf:$LIB_HOME/* $APP_MAIN_CLASS > nohup.out 2>&1 &"echo "$APP_HOME"echo "Exec cmmand : $JAVA_CMD"sh -c "$JAVA_CMD"sleep 3checkpidif [[ $? -eq 0 ]]thensuccess "(PID=$PID) "elsefailure " "fifi
}
function stop() {checkpidif [[ $? -eq 0 ]];thenecho -n "[$APP_MAIN_CLASS]: Shutting down ...(PID=$PID) "kill -9 $PIDif [[ $? -eq 0 ]];thenecho 0 > $PID_FILEsuccess " "elsefailure " "fielsewarning "[$APP_MAIN_CLASS]: is not running ..."fi
}
function status() {checkpidif [[ $? -eq 0 ]]thensuccess "[$APP_MAIN_CLASS]: is running! (PID=$PID)"return 0elsefailure "[$APP_MAIN_CLASS]: is not running"return 1fi
}
function info() {echo "System Information:"echo echo "****************************"echo `head -n 1 /etc/issue`echo `uname -a`echoecho "JAVA_HOME=$JAVA_HOME"echo echo "JAVA Environment Information:"echo `$JAVA -version`echoecho "APP_HOME=$APP_HOME"echo "APP_MAIN_CLASS=$APP_MAIN_CLASS"echo echo "****************************"
}
case "$1" in'start')start;;'stop')stop;;'restart')stopstart;;'status')status;;'info')info;;*)echo "Usage: $0 {help|start|stop|restart|status|info}";;
esac
exit 0
备注:
mvn install 运行成功后,会在模块target/目录下生成一个 xxx.zip 压缩文件,解压缩后的文件目录为:
上传到服务器后,运行 start.sh 对应的配置文件config/application-local.yaml 所以你要修改这个配置,数据库连接等。