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,从而实现启停、状态查看。

posted on   Jasteen  阅读(2098)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

导航

统计

点击右上角即可分享
微信分享提示