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")
}
相关推荐
码luffyliu2 分钟前
Go 中的深浅拷贝:从城市缓存场景讲透指针与内存操作
后端·go·指针·浅拷贝·深拷贝
老华带你飞4 分钟前
个人网盘管理|基于springboot + vue个人网盘管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
JaguarJack15 分钟前
PHP 之高级面向对象编程 深入理解设计模式、原则与性能优化
后端·php
章豪Mrrey nical8 小时前
前后端分离工作详解Detailed Explanation of Frontend-Backend Separation Work
后端·前端框架·状态模式
派大鑫wink9 小时前
【JAVA学习日志】SpringBoot 参数配置:从基础到实战,解锁灵活配置新姿势
java·spring boot·后端
程序员爱钓鱼9 小时前
Node.js 编程实战:文件读写操作
前端·后端·node.js
xUxIAOrUIII9 小时前
【Spring Boot】控制器Controller方法
java·spring boot·后端
Dolphin_Home9 小时前
从理论到实战:图结构在仓库关联业务中的落地(小白→中级,附完整代码)
java·spring boot·后端·spring cloud·database·广度优先·图搜索算法
zfj3219 小时前
go为什么设计成源码依赖,而不是二进制依赖
开发语言·后端·golang
weixin_4624462310 小时前
使用 Go 实现 SSE 流式推送 + 打字机效果(模拟 Coze Chat)
开发语言·后端·golang