瘦Jar包
java 生成 jar 包一般都默认采用 fat 模式,导致生成的 jar 包很大,因为包含了所有依赖包,传输的时候如果网速慢的话会很不太方便。通常,正式包发布后,依赖 jar 包就不会太变化,变化的一般是业务逻辑,所以如果能把业务 jar 包和依赖 jar 包分开,即 thin 模式,那么只需要每次更新业务 jar 包就行了。但 fat 也方便了本地部署,因为就只有一个 jar 包,所以在正式版发布前,内网测试还是应该采用 fat 模式。
项目构建文件
build.gradle
task expDepJars(type: Sync) {
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
from System.properties['java.home'] + '/lib/ext'
from configurations.runtimeClasspath
into "$buildDir/libs/lib"
}
bootJar {
excludes = ["*.jar"]
dependsOn expDepJars
}
- 采用 Sync 类型,而不是 Copy,这样每次会删除已经弃用的依赖 jar 包;
- System.properties[‘java.home’] + ‘/lib/ext’ :标准 jre 额外依赖 jar 包;
- 采用 configurations.compileClasspath 会少包,所以这里用 configurations.runtimeClasspath。
同步远程依赖包
rsync -v -r --ignore-existing --delete build/libs/lib 192.168.12.34:/home/cloud/file/test
- ignore-existing 表示如果远程中已经有同名 jar 包,则不重复传输,因为同名依赖 jar 包一定是一样的文件;
- delete 表示以本地为主,对远程进行同步,多则删之,少则补之;
- 本地依赖 jar 包目录 build/libs/lib 对应远程依赖 jar 包目录 /home/cloud/file/test/lib。
镜像制作
项目构建文件
build.gradle
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath('se.transmode.gradle:gradle-docker:1.2')
}
}
apply plugin: 'docker'
group = 'java'
version = '1.8'
jar {
archivesBaseName = 'base'
archiveVersion = '1.8'
}
// use `sudo gradle build buildImage`
task buildImage(type: Docker, dependsOn: build) {
push = false
applicationName = 'base'
dockerfile = file('src/main/docker/Dockerfile')
doFirst {
copy {
from jar
into stageDir
}
}
}
- 只需配置Docker镜像生成任务相关;
Docker镜像生成文件
src/main/docker/Dockerfile:
FROM openjdk:8u181-jre-alpine
VOLUME /tmp
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.security.strategy=MODE_INHERITABLETHREADLOCAL", "-Dspring.config.location=/src/main/resources/config/application.yml", "-Djava.ext.dirs=/applib", "-jar", "/app.jar"]
- 业务 jar 包为 /app.jar,额外依赖 jar 包在 /applib,配置文件都放在 /main/resources/config,这里的路径都是容器中的路径;
- 这里之所以把 application.yml 放在 /main/resources/config,是因为项目数不多,采取每个项目一个库,即多mysql数据源切换连接方式;
- 生成的镜像为:java/base:1.8。
本地生成离线镜像:
docker save java/base:1.8 | gzip > javabase.tar.gz
主机加载离线镜像:
docker load < javabase.tar.gz
运行实际业务
docker run -u root -d --name test -p 8080:8080 -h 192.168.12.34/test \
--restart=always --log-driver=json-file --log-opt max-size=20m --log-opt max-file=5 \
-v /home/cloud/conf/test:/src/main/resources/config \
-v /home/cloud/file/test/test-0.0.1.jar:/app.jar \
-v /home/cloud/file/test/lib:/applib \
-v /etc/localtime:/etc/localtime:ro \
java/base:1.8
- /home/cloud/file/test/test-0.0.1.jar 一般是生成的 springboot 业务 jar 包;
- /home/cloud/file/test/lib 放额外依赖 jar 包;