thingsboard如何编译出rpm包

整体思路: 在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格式)。它的主要功能包括:

  1. 支持多种包格式:可以生成RPM和DEB两种主流Linux包格式
  2. 文件系统布局控制:可以精确控制文件在目标系统中的安装位置
  3. 权限设置:可以为文件和目录设置权限
  4. 依赖管理:可以声明软件包依赖关系
  5. 安装/卸载脚本:支持pre/post安装和卸载脚本
  6. 符号链接创建:可以在安装时创建符号链接
  7. 用户/组管理:可以指定运行用户和组
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")
}
相关推荐
码小凡2 小时前
优雅!用了这两款插件,我成了整个公司代码写得最规范的码农
java·后端
星星电灯猴3 小时前
Charles抓包工具深度解析:如何高效调试HTTPHTTPS请求与API接口
后端
isfox3 小时前
Hadoop 版本进化论:从 1.0 到 2.0,架构革命全解析
大数据·后端
normaling3 小时前
四、go语言指针
后端
yeyong4 小时前
用springboot开发一个snmp采集程序,并最终生成拓扑图 (二)
后端
掉鱼的猫4 小时前
Solon AI 五步构建 RAG 服务:2025 最新 AI + 向量数据库实战
java·redis·后端
HyggeBest4 小时前
Mysql之undo log、redo log、binlog日志篇
后端·mysql
java金融4 小时前
FactoryBean 和BeanFactory的傻傻的总是分不清?
java·后端
独立开阀者_FwtCoder5 小时前
Nginx 部署负载均衡服务全解析
前端·javascript·后端