整体思路: 在application项目中,引用maven plugin 来调用gradle 任务来编译rpm包。
在pom.xml中配置了gradle-maven-plugin插件,用于调用Gradle构建任务来生成RPM包。相关配置如下:
xml
<plugin>
<groupId>org.thingsboard</groupId>
<artifactId>gradle-maven-plugin</artifactId>
<configuration>
<gradleProjectDirectory>${main.dir}/packaging/${pkg.type}</gradleProjectDirectory>
<tasks>
<task>buildRpm</task> <!-- 指定执行buildRpm任务 -->
</tasks>
<args>
<arg>-PpackagingDir=${main.dir}/packaging</arg>
<arg>-PprojectBuildDir=${basedir}/target</arg>
<arg>-PprojectVersion=${project.version}</arg>
<arg>-PmainJar=${project.build.directory}/${project.build.finalName}-boot.${project.packaging}</arg>
<arg>-PpkgName=${pkg.name}</arg>
<arg>-PpkgUser=${pkg.user}</arg>
<arg>-PpkgInstallFolder=${pkg.installFolder}</arg>
<arg>-PpkgLogFolder=${pkg.unixLogFolder}</arg>
</args>
</configuration>
</plugin>
在packaging/java/build.gradle中定义了buildRpm任务,这是实际生成RPM包的核心逻辑
groovy
buildRpm {
arch = NOARCH
archiveFileName = "${pkgName}.rpm"
requires("java-11") // 依赖Java 11
// 配置文件处理
from("${buildDir}/conf") {
include "${pkgName}.conf"
filter(ReplaceTokens, tokens: ['pkg.platform': 'rpm'])
into "${pkgInstallFolder}/conf"
}
// 安装脚本
preInstall file("${buildDir}/control/rpm/preinst")
postInstall file("${buildDir}/control/rpm/postinst")
preUninstall file("${buildDir}/control/rpm/prerm")
postUninstall file("${buildDir}/control/rpm/postrm")
// 用户和权限设置
user pkgUser
permissionGroup pkgUser
// 服务文件
from("${buildDir}/control/template.service") {
into "/lib/systemd/system"
rename { "${pkgName}.service" }
}
}
其中gradle 也是用nebula.ospackage gradle 插件。
nebula.ospackage 是一个Gradle插件,主要用于构建Linux系统的软件包(RPM和DEB格式)。它的主要功能包括:
- 支持多种包格式:可以生成RPM和DEB两种主流Linux包格式
- 文件系统布局控制:可以精确控制文件在目标系统中的安装位置
- 权限设置:可以为文件和目录设置权限
- 依赖管理:可以声明软件包依赖关系
- 安装/卸载脚本:支持pre/post安装和卸载脚本
- 符号链接创建:可以在安装时创建符号链接
- 用户/组管理:可以指定运行用户和组
groovy
plugins {
id "nebula.ospackage" version "8.6.3"
}
version = '1.0.0'
// 通用包配置
ospackage {
packageName = "myapp"
version = project.version
release = 1
os = LINUX
type = BINARY
into "/opt/myapp" // 安装目录
user "myapp" // 运行用户
permissionGroup "myapp" // 用户组
// 添加主jar文件
from("build/libs/myapp.jar") {
into "bin"
fileMode 0500 // 可读可执行
}
// 添加配置文件
from("conf") {
into "conf"
fileMode 0644 // 可读
}
// 添加启动脚本
from("scripts/myapp.sh") {
into "bin"
fileMode 0755 // 可执行
}
// 添加文档
from("docs") {
into "usr/share/doc/myapp"
}
}
// RPM包特定配置
buildRpm {
arch = NOARCH // 架构无关
requires("java-11") // 依赖Java 11
// 安装前后脚本
preInstall file("scripts/rpm/preinst")
postInstall file("scripts/rpm/postinst")
preUninstall file("scripts/rpm/prerm")
postUninstall file("scripts/rpm/postrm")
// 创建符号链接
link("/usr/bin/myapp", "/opt/myapp/bin/myapp.sh")
}
// DEB包特定配置
buildDeb {
arch = "all" // 架构无关
requires("openjdk-11-jre").or("java11-runtime") // 依赖Java 11
// 安装前后脚本
preInstall file("scripts/deb/preinst")
postInstall file("scripts/deb/postinst")
preUninstall file("scripts/deb/prerm")
postUninstall file("scripts/deb/postrm")
// 配置文件标记
configurationFile("/opt/myapp/conf/app.conf")
// 创建符号链接
link("/usr/bin/myapp", "/opt/myapp/bin/myapp.sh")
}