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")
}
相关推荐
这里有鱼汤1 分钟前
通过AI狂赚苹果26.6%,这套AI金融交易开源Agent彻底火了
后端·agent
寻月隐君10 分钟前
【Solana 开发实战】轻松搞定链上 IDL:从上传到获取全解析
后端·web3·github
程序员爱钓鱼21 分钟前
Go项目上线部署最佳实践:Docker容器化从入门到进阶
后端·google·go
汪子熙22 分钟前
Visual Studio Code 中排除指定文件夹搜索的最佳实践与实现原理
后端·面试
大P哥阿豪1 小时前
Go defer(二):从汇编的角度理解延迟调用的实现
开发语言·汇编·后端·golang
风象南1 小时前
SpringBoot 与 HTMX:现代 Web 开发的高效组合
java·spring boot·后端
wstcl2 小时前
让你的asp.net网站在调试模式下也能在局域网通过ip访问
后端·tcp/ip·asp.net
ai小鬼头10 小时前
Ollama+OpenWeb最新版0.42+0.3.35一键安装教程,轻松搞定AI模型部署
后端·架构·github
萧曵 丶10 小时前
Rust 所有权系统:深入浅出指南
开发语言·后端·rust
老任与码11 小时前
Spring AI Alibaba(1)——基本使用
java·人工智能·后端·springaialibaba