SpringBoot项目使用Gradle打包
使用Gradle生成的Springboot应用包目录结构如下:
├── 应用部署包
│ ├── config
│ └── application.properties
│ └── application-pord.properties
│ └── locale
│ └── ……
│ └── template
│ └── ……
│ └── emailTemplate
│ └── ……
│ └── ……
│ ├── lib
│ └── xxxx.jar
│ └── XXX-bootstarter.jar
│ └── bootapp.sh
在应用部署包目录下,XXX-bootstarter.jar是Springboot主应用类所在Jar包,bootapp.sh是启动脚本,可以执行start/stop/restart命令。使用bootapp.sh启动应用时,会自动在当前模板下搜索包名中包含bootstarter的jar包并启动,启动命令如下:
nohup java -Dloader.path=$HOME/lib -jar $HOME/$JAR --logging.config=$HOME/config/log4j2.xml > $HOME/server.log 2>&1
其中 -Dloader.path用于指定依赖jar包所在的目录,这个目录下面包含了依赖的外部jar包以及应用内其他模块的jar包。SpringBoot服务启动模块的Gradle打包脚本如下:
group = 'com.xxxx' version = '1.20.0' sourceCompatibility = '1.8' targetCompatibility = 1.8 configurations { all*.exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' } dependencies { …… } tasks.withType(JavaCompile) { options.encoding = "UTF-8" } // 将依赖包复制到lib目录 task copyJar(type: Copy) { // 清除现有的lib目录 delete "$buildDir\\libs\\lib" // 拷贝依赖模块jar包 from configurations.runtimeClasspath into "$buildDir\\libs\\lib" // 拷贝外部依赖jar包 from configurations.compileClasspath into "$buildDir\\libs\\lib" doLast { delete "$buildDir\\libs\\lib\\com" } } // 拷贝配置文件 task copyConfigFile(type: Copy) { // 清除现有的配置目录 delete "$buildDir\\libs\\config" from('src/main/resources') into 'build/libs/config' } // 拷贝父模块下通用配置文件 task copyCommonConfigFile(type: Copy){ def rootDir = "${project.rootDir.getAbsolutePath()}" from( "${project.rootDir.getAbsolutePath()}\\xxxx\\src\\main\\resources") into 'build/libs/config' exclude 'com' exclude 'application.properties' exclude 'log4j.*' exclude 'spring-*.xml' from( "${project.rootDir.getAbsolutePath()}\\xxxx\\src\\main\\webapp\\WEB-INF") into 'build/libs/config' exclude 'web.xml' } copyCommonConfigFile.dependsOn copyJar // 配置bootJar进行打包 bootJar { // jar包名称,默认是settings.gradle下的工程名 rootProject.name = 'alog-server' archiveBaseName = 'dd-bootstarter' // jar包版本号 archiveVersion = '4.20.0' duplicatesStrategy = DuplicatesStrategy.INCLUDE // 排除所有的jar excludes = ["*.jar","*.xml","*.properties"] // lib目录的清除和复制任务 dependsOn copyJar // 配置目录的清除和复制任务 dependsOn copyConfigFile dependsOn copyCommonConfigFile // 指定依赖包的路径 manifest { attributes "Start-Class": "com.xxxx.bootstarter.XXXXXWebApplication", "Manifest-Version": 1.0, 'Main-Class': 'org.springframework.boot.loader.PropertiesLauncher' } }
注意:脚本bootJar任务中,需要指定Main-Class 为org.springframework.boot.loader.PropertiesLauncher,否则在启动服务的时候-Dloader.path参数不生效。
服务启停
Springboot服务启动命令:
nohup java -Dloader.path=./lib -jar XXXX-bootstarter-4.20.0.jar --logging.config=./config/log4j2.xml > server.log &
可以看到命令中需要指定log4j2配置文件的相对路径,并且将控制台输出的服务日志重定向到当前目录的server.log文件中。
Springboot服务可使用下面的脚本实现启停、查看状态等操作:
#!/bin/bash #端口号,根据此端口号确定PID PORT=32000 #jar包所在目录 HOME=$(dirname $(readlink -f "$0")) JAR_FILE=$(find $HOME -maxdepth 1 -name *bootstarter*.jar) if [ -z "$JAR_FILE" ]; then echo "not find JAR file in $HOME, app start failed." exit 0 fi JAR=${JAR_FILE##*/} echo "find JAR=$JAR, try to start it ......" APPNAME=${JAR%.*} #查询出监听了PORT端口TCP协议的程序 pid=`netstat -anlptu|awk '{$5=""; print $0}' | grep 32000 | awk '{printf $6}'|cut -d/ -f1` start(){ echo "INFO: Starting $APPNAME ..." if [ -n "$pid" ]; then echo "$APPNAME server already start,pid:$pid" return 0 fi #进入命令所在目录 cd $HOME nohup java -Dloader.path=$HOME/lib -jar $HOME/$JAR --logging.config=$HOME/config/log4j2.xml > $HOME/server.log 2>&1 & #启动服务 把日志输出到HOME目录的server.log文件中 echo "$APPNAME start at port:$PORT" } stop(){ if [ -z "$pid" ]; then echo "not find program $APPNAME on port:$PORT" return 0 fi #结束程序,使用讯号2,如果不行可以尝试讯号9强制结束 kill -9 $pid rm -rf $pid while true do process=`netstat -anlptu|awk '{$5=""; print $0}' | grep 32000 | awk '{printf $6}'|cut -d/ -f1`; if [ "$process" != "" ]; then echo "process id is $process"; sleep 1; echo "stoping ..."; else echo "service $APPNAME stop"; break; fi done } status(){ if [ -z "$pid" ]; then echo "not find program $APPNAME on port:$PORT" else echo "$APPNAME program is running,pid:$pid" fi } case $1 in start) start ;; stop) stop ;; restart) $0 stop sleep 2 $0 start ;; status) status ;; *) echo "Usage: {start|stop|status}" ;; esac exit 0
具体使用时,需要修改脚本中的PORT属性值,脚本是根据监听的端口号确定服务的PID,从而实现启停、状态查看。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性