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")
}
相关推荐
勇哥java实战分享8 分钟前
短信平台 Pro 版本 ,比开源版本更强大
后端
学历真的很重要13 分钟前
LangChain V1.0 Context Engineering(上下文工程)详细指南
人工智能·后端·学习·语言模型·面试·职场和发展·langchain
计算机毕设VX:Fegn089516 分钟前
计算机毕业设计|基于springboot + vue二手家电管理系统(源码+数据库+文档)
vue.js·spring boot·后端·课程设计
上进小菜猪32 分钟前
基于 YOLOv8 的智能杂草检测识别实战 [目标检测完整源码]
后端
韩师傅1 小时前
前端开发消亡史:AI也无法掩盖没有设计创造力的真相
前端·人工智能·后端
栈与堆2 小时前
LeetCode-1-两数之和
java·数据结构·后端·python·算法·leetcode·rust
superman超哥2 小时前
双端迭代器(DoubleEndedIterator):Rust双向遍历的优雅实现
开发语言·后端·rust·双端迭代器·rust双向遍历
1二山似2 小时前
crmeb多商户启动swoole时报‘加密文件丢失’
后端·swoole
马卡巴卡2 小时前
Java CompletableFuture 接口与原理详解
后端
神奇小汤圆2 小时前
Java线程协作工具:CountDownLatch 、CyclicBarrier、Phaser、Semaphore 、Exchanger
后端