使用Gradle将java应用打包为类似tomcat的目录结构
背景
当前Gradle打包的方式有打包成单一的jar或多个jar包的方式,可参考这篇文章
当前的问题
从运行维护的角度上看,单一的jar包运行方式在后期的修改和部署存体积过大的问题,若使用多个jar包的方式,则主工程中若修改配置时,则必须重新打包,稍显麻烦
改进
在多个jar包的基础上,将工程jar包从解压至classes目录,将从lib文件夹移除,在启动的脚本的classpath将主工程的jar包替换为classes目录。若需要修改配置文件时,则直接在classes文件夹中修改,重启可生效,避免重新打包。
build.gradle脚本
archivesBaseName = 'server'
version = '1.0.0'
// 将程序打包成bin及lib两个文件夹,以便替换及修改配置
apply plugin: 'application'
// 启动类
mainClassName = 'com.cdy.Server'
// 将classpath中的lib/server的jar包替换成classes文件夹
startScripts {
defaultJvmOpts = ["-Xms512m", "-Xmx2048m"]
doLast {
unixScript.text = unixScript.text.replace('lib/' + archivesBaseName + '-' + version + '.jar', 'classes')
windowsScript.text = windowsScript.text.replace('lib\\' + archivesBaseName + '-' + version + '.jar', 'classes')
}
}
// 自定义脚本
task updateHostingExtraRunApp(type: CreateStartScripts) {
defaultJvmOpts = startScripts.defaultJvmOpts
classpath = startScripts.classpath
}
// 生成classes文件夹,移除server的jar包,最终生成bin, classes, lib三个文件夹
distributions {
main {
contents {
from("$buildDir/classes/java/main") {
into "classes"
}
from("$buildDir/resources/main") {
into "classes"
}
exclude(archivesBaseName + "*.jar")
}
}
}
执行命令gradle build,查看build/distributions会有两个压缩文件,压缩文件包含了两个文件夹,bin为启动脚本,classes为工程编译后的文件,lib则是软件jar包和依赖。还可以执行./gradlew installDist生成未压缩文件目录build/install。