使用Gradle+bootJar打包和分离lib包和配置文件
在项目的根目录下的build.gradle文件中添加如下代码:
// 将依赖包复制到lib目录
task copyJar(type: Copy) {
// 清除现有的lib目录
delete "$buildDir\\libs\\lib"
from configurations.compileClasspath
into "$buildDir\\libs\\lib"
}
// 拷贝配置文件
task copyConfigFile(type: Copy) {
// 清除现有的配置目录
delete "$buildDir\\libs\\config"
from('src/main/resources')
into 'build/libs/config'
}
// 配置bootJar进行打包
bootJar {
// jar包名称,默认是settings.gradle下的工程名 rootProject.name = 'alog-server'
baseName = 'alog-server'
// jar包版本号
version = '0.0.1'
// 排除所有的jar
excludes = ["*.jar"]
// lib目录的清除和复制任务
dependsOn copyJar
// 配置目录的清除和复制任务
dependsOn copyConfigFile
// 指定依赖包的路径
manifest {
attributes "Manifest-Version": 1.0,
'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
}
}
执行bootJar任务
分析打包结果
-
查看在工程根目录下的build目录下。
-
查看jar包,大小只有183KB,以后替换上传到服务器端的时候会很方便。
-
查看配置文件config目录,程序默认先加载config下的配置,再加载jar包内的配置,所以可以在外部动态修改配置。
Spring boot 启动会扫描以下位置的application.properties或者application.yml文件
file:./config/
(jar包当前目录下的config目录)
file:./
( jar包当前目录)
classpath:/config/
( 类文件下的config目录)
classpath:/
( 类文件下目录) -
查看lib目录
补充
补充一、下面有留言说“baseName和version属性过期了,有替代方法吗
”,答案是有的。
在IDEA里按住ctrl+左键点击baseName
查看bootJar的源码,如下:
// 弃用注解
@Deprecated
public void setBaseName(@Nullable String baseName) {
this.archiveBaseName.set(baseName);
}
这里调用的是this.archiveBaseName.set(baseName);
方法,所以替代方法就是archiveBaseName
,所以上面的脚本可以优化一下如下:
// 将依赖包复制到lib目录
task copyJar(type: Copy) {
// 清除现有的lib目录
delete "$buildDir\\libs\\lib"
from configurations.compileClasspath
into "$buildDir\\libs\\lib"
}
// 拷贝配置文件
task copyConfigFile(type: Copy) {
// 清除现有的配置目录
delete "$buildDir\\libs\\config"
from('src/main/resources')
into 'build/libs/config'
}
// 配置bootJar进行打包
bootJar {
// jar包名称,默认是settings.gradle下的工程名 rootProject.name = 'alog-server'
archiveBaseName = 'alog-server'
// jar包版本号
archiveVersion = '0.0.1'
// 排除所有的jar
excludes = ["*.jar"]
// lib目录的清除和复制任务
dependsOn copyJar
// 配置目录的清除和复制任务
dependsOn copyConfigFile
// 指定依赖包的路径
manifest {
attributes "Manifest-Version": 1.0,
'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
}
}
补充二 Phil01留言说copy jar包少的问题,我试了好像都可以,不过copy多一点肯定不会出问题,这里更改一下copy jar包的方法。
// 将依赖包复制到lib目录
task copyJar(type: Copy) {
// 清除现有的lib目录
delete "$buildDir\\libs\\lib"
from configurations.runtime
into "$buildDir\\libs\\lib"
from configurations.compileClasspath
into "$buildDir\\libs\\lib"
}
// 拷贝配置文件
task copyConfigFile(type: Copy) {
// 清除现有的配置目录
delete "$buildDir\\libs\\config"
from('src/main/resources')
into 'build/libs/config'
}
// 配置bootJar进行打包
bootJar {
// jar包名称,默认是settings.gradle下的工程名 rootProject.name = 'alog-server'
archiveBaseName = 'alog-server'
// jar包版本号
archiveVersion = '0.0.1'
// 排除所有的jar
excludes = ["*.jar"]
// lib目录的清除和复制任务
dependsOn copyJar
// 配置目录的清除和复制任务
dependsOn copyConfigFile
// 指定依赖包的路径
manifest {
attributes "Manifest-Version": 1.0,
'Class-Path': configurations.compileClasspath.files.collect { "lib/$it.name" }.join(' ')
}
}