• Electron集成Java服务端制作deb包


    环境和源文件

    • 净室环境

      净室环境指的是没有任何其他配置,刚刚安装好的一个系统环境。
      净室环境是为了避免一些依赖问题。
      可以通过虚拟机或者实体机来获得,这里推荐使用虚拟机,实体机相对成本更高。

    • 净室环境系统:
      本次使用系统环境为 deepin-desktop-community-20.3-amd64


    • 源文件结构树:

      demo文件夹为electron:build后输出的文件夹(Linux环境下)
      其中scripts、server、res文件夹为后添加到demo目录中

      demo
      ├── chrome_100_percent.pak
      ├── chrome_200_percent.pak
      ├── chrome_crashpad_handler
      ├── chrome-sandbox
      ├── demo                --electron打包成的Linux可执行文件
      ├── icudtl.dat
      ├── libEGL.so
      ├── libffmpeg.so
      ├── libGLESv2.so
      ├── libvk_swiftshader.so
      ├── libvulkan.so.1
      ├── LICENSE.electron.txt
      ├── LICENSES.chromium.html
      ├── locales
      ├── resources
      ├── resources.pak
      ├── scripts             --配置脚本和服务
      │   └── demo.service    --Linux服务(后续有详解)
      ├── server              --Java服务
      │   ├── demo.jar        --Java服务jar包
      │   └── jre             --jre运行环境
      ├── snapshot_blob.bin
      ├── swiftshader
      ├── res                 --资源文件夹
      │   └── Favs.ico        --图标ico文件
      ├── v8_context_snapshot.bin
      └── vk_swiftshader_icd.json
      
      

    Service服务配置

    • demo.service完整内容(使用打包到deb包中的jre执行jar包)

      如果不注册成linux服务的话每次都需要执行Java -jar demo.jar 很麻烦,对使用者也十分的不友好,所以这里将jar包服务注册到linux服务中,并设置开机自启。

      [Unit]
      Description=demo-server                                    
      
      [Service]
      Type=simple                                                 
      ExecStart=/usr/local/demo/server/jre/bin/java -jar /usr/local/demo/server/demo.jar
      
      [Install]
      WantedBy=multi-user.target
      
      
    • Service 区块配置

      • [Unit] 区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。

      字段 说明
      Description 简短描述
      Documentation 文档地址
      Requires 当前 Unit 依赖的其他 Unit,如果它们没有运行,当前 Unit 会启动失败
      Wants 与当前 Unit 配合的其他 Unit,如果它们没有运行,当前 Unit 不会启动失败
      BindsTo 与Requires类似,它指定的 Unit 如果退出,会导致当前 Unit 停止运行
      Before 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之后启动
      After 如果该字段指定的 Unit 也要启动,那么必须在当前 Unit 之前启动
      Conflicts 这里指定的 Unit 不能与当前 Unit 同时运行
      Condition... 当前 Unit 运行必须满足的条件,否则不会运行
      Assert... 当前 Unit 运行必须满足的条件,否则会报启动失败
      • [Install] 通常是配置文件的最后一个区块,用来定义如何启动,以及是否开机启动。它的主要字段如下。

      字段 说明
      WantedBy 它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中
      RequiredBy 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中
      Alias 当前 Unit 可用于启动的别名
      Also 当前 Unit 激活(enable)时,会被同时激活的其他 Unit
      • [Service] 区块用来 Service 的配置,只有 Service 类型的 Unit 才有这个区块。它的主要字段如下。

      字段 说明
      Type 定义启动时的进程行为。它有以下几种值。
      Type=simple 默认值,执行ExecStart指定的命令,启动主进程
      Type=forking 以 fork 方式从父进程创建子进程,创建后父进程会立即退出
      Type=oneshot 一次性进程,Systemd 会等当前服务退出,再继续往下执行
      Type=dbus 当前服务通过D-Bus启动
      Type=notify 当前服务启动完毕,会通知Systemd,再继续往下执行
      Type=idle 若有其他任务执行完毕,当前服务才会运行
      ExecStart 启动当前服务的命令
      ExecStartPre 启动当前服务之前执行的命令
      ExecStartPost 启动当前服务之后执行的命令
      ExecReload 重启当前服务时执行的命令
      ExecStop 停止当前服务时执行的命令
      ExecStopPost 停止当其服务之后执行的命令
      RestartSec 自动重启当前服务间隔的秒数
      Restart 定义何种情况 Systemd 会自动重启当前服务,可能的值包括always(总是重启)、on-success、on-failure、on-abnormal、on-abort、on-watchdog
      TimeoutSec 定义 Systemd 停止当前服务之前等待的秒数
      Environment 指定环境变量

    Debian打包结构和配置

    • deb包结构

      它具有DEBIAN和软件具体安装目录(如etc, usr, opt, tmp等)

    • 打包完整目录树

      pkg
      ├── DEBIAN
      │   ├── control
      │   ├── postinst
      │   ├── postrm
      │   ├── preinst
      │   └── prerm
      └── usr
          ├── local
          │   └── demo            --此demo文件夹为上边源文件demo
          └── share
              └── applications
                  └── demo.desktop
      
      
    • Control完整内容:

      Package: demo
      Section: Internet
      Priority: extra
      Version: 1.0.0
      Maintainer: liuCh
      Architecture: amd64
      Depends: libappindicator3-1
      Recommends: libwebkit2gtk-4.0.37,libwebkitgtk-3.0-0
      Description: This is demo
      
    • Control:
      这个文件主要描述软件包的名称(Package),版本(Version),Installed-Size(大小),Maintainer(打包人和联系方式)以及描述(Description)等,是deb包必须具备的描述性文件,以便于软件的安装管理和索引。


      字段 说明 例子/备注
      Package 程序名称 中间不能有空格
      Version 软件版本
      Description 程序说明
      Section 软件类别 utils, net, mail, text, x11
      Priority 软件对于系统的重要程度 required, standard, optional, extra等;
      Essential 是否是系统最基本的软件包 yes/no,若为yes,则不允许卸载(除非强制性卸载)
      Architecture 软件所支持的平台架构 i386, amd64, m68k, sparc, alpha, powerpc等
      Source 软件包的源代码名称
      Depends 软件所依赖的其他软件包和库文件 若依赖多个软件包和库文件,采用逗号隔开
      Pre-Depends 软件安装前必须安装、
      配置依赖性的软件包和库文件 常用于必须的预运行脚本需求
      Recommends 推荐安装的其他软件包和库文件
      Suggests 建议安装的其他软件包和库文件
    • preinst完整内容: (校验是否已存在demo文件夹和是不是root用户安装)

      #!/bin/bash
      if [ -d "/usr/local/demo" ]; then
      	echo "error: please uninstall demo package first."
      	exit 1;
      fi
      	if [ $(whoami) != 'root' ]; then
      		if [ "$1" == "" ]; then
      			echo 'demo client needs root to complete installation'
      		else
      			echo "$1"
      		fi
      		exit 1
      	fi
      
    • preinst:
      在Deb包文件解包之前(即软件安装前),将会运行该脚本。可以停止作用于待升级软件包的服务,直到软件包安装或升级完成。

    • postinst完整内容:(创建日志文件夹和注册demo.service服务设置开机自启并启动)

      #!/bin/bash
      
      #kill all runing demo
      killall demo > /dev/null 2>&1
      
      #clear log files
      if [ -d '/var/log/demo' ]; then
        rm -rf /var/log/demo
      fi
      
      mkdir /var/log/demo
      chmod 777 /var/log/demo
      
      #echo "create init"
      cp /usr/local/demo/scripts/demo.service /etc/systemd/system/demo.service || echoAndExit 'can not copy init file demo.service'
      
      #设置开机自启
      systemctl enable demo.service
      
      #启动服务
      systemctl start demo.service
      
      #创建桌面快捷图标
      cp /usr/share/applications/demo.desktop /home/$(who | awk '{print $1}')/Desktop/
      
      
    • postinst:
      负责完成安装包时的配置工作。如新安装或升级的软件重启服务。软件安装完后,执行该Shell脚本,一般用来配置软件执行环境,必须以“#!/bin/sh”为首行。

    • prerm完整内容:(删除服务)

      #!/bin/bash
      systemctl stop demo.service
      
      systemctl disable demo.service
      
      rm /etc/systemd/system/demo.service > /dev/null 2>&1
      
    • prerm:
      该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

    • postrm完整内容:(删除创建的日志文件夹)

      #!/bin/bash
      if [ "$1" == "purge" ]; then
      	if [ -d "/var/log/demo" ]; then
      		rm -rf /var/log/demo
      	fi
      fi
      
    • postrm:
      负责修改软件包链接或文件关联,或删除由它创建的文件。软件卸载后,执行该Shell脚本,一般作为清理收尾工作,必须以“#!/bin/sh”为首行

    • demo.desktop完整内容

      [Desktop Entry]
      #StartupWMClass=demo
      Categories=Network;RemoteControl;
      Comment=This is demo
      Comment[zh_CN]=这是一个演示
      Exec=/usr/local/demo/demo
      GenericName=demo
      GenericName[zh_CN]=演示程序
      Icon=/usr/local/demo/res/Favs.ico
      Name=demo
      Name[zh_CN]=演示
      StartupNotify=false
      Terminal=false
      Type=Application
      X-Deepin-Vendor=user-custom
      
    • desktop
      Desktop Entry文件是Linux桌面系统中用于描述程序启动配置信息的文件,它以.desktop为后缀名,相当于Windows系统下的桌面快捷方式。通常一个二进制可执行程序是一个没有后缀没有图标的文件,不可以随意移动。
      因此很多Linux发行版都提供了启动器,便于集中管理应用程序。启动器本质是一个位于/usr/share/applications/路径下的目录。启动器目录中存放着很多.desktop文件,每个.desktop文件都是一个应用程序的入口,并且.desktop文件可以显示图标,对用户更加友好。

      • desktop 文件结构
      字段 是否必选 说明
      Version 该数值指定了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本
      Name 应用程序名称
      GenericName 应用程序的通用名称
      Comment 描述
      Type "Type"定义了Desktop Entry文件的类型。常见的"Type"数值是"Application"和"Link"。"Type = Application"表示当前Desktop Entry文件指向了一个应用程序;而"Type = Link"表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。
      Exec "Exec"只有Type=Application才有效,"Exec"的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的
      URL "URL"只有Type=Link才有效。"URL"的数值定义了该Desktop Entry文件指向的URL
      Icon "Icon"的数值是以绝对路径的格式给出,图标的绝对路径。
      StartupNotify 布尔值,只有Type=Application才有效,如果为true,则已知应用程序在使用DESKTOP_STARTUP_ID环境变量集启动时将发送“remove”消息。
      Terminal 布尔值,只有Type=Application才有效,相关应用程序(即关键字"Exec"的数值)是否需要在终端窗口中运行.
      Categories 只有Type=Application才有效,程序在菜单中显示的类别,network:网络应用;Chat:社交沟通;Audio:音乐欣赏;Video:视频播放;Graphics:图形图像;Office:办公学习;Translation:阅读翻译;Development:编程开发;Utility:系统管理;
    • 补充:

      • 文件比较运算符

      命令 说明 例子/备注
      -e filename 如果 filename存在,则为真 [ -e /var/log/syslog ]
      -d filename 如果 filename为目录,则为真 [ -d /tmp/mydir ]
      -f filename 如果 filename为常规文件,则为真 [ -f /usr/bin/grep ]
      -L filename 如果 filename为符号链接,则为真 [ -L /usr/bin/grep ]
      -r filename 如果 filename可读,则为真 [ -r /var/log/syslog ]
      -w filename 如果 filename可写,则为真 [ -w /var/mytmp.txt ]
      -x filename 如果 filename可执行,则为真 [ -x /usr/bin/grep ]
      filename1-nt filename2 如果 filename1比 filename2新,则为真 [ /tmp/install/etc/services -nt /etc/services ]
      filename1-ot filename2 如果 filename1比 filename2旧,则为真 [ /boot/bzImage -ot arch/i386/boot/bzImage ]

      • 字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)

      命令 说明 例子/备注
      -z string 如果 string长度为零,则为真 [ -z "$myvar" ]
      -n string 如果 string长度非零,则为真 [ -n "$myvar" ]
      string1= string2 如果 string1与 string2相同,则为真 [ "$myvar" = "one two three" ]
      string1!= string2 如果 string1与 string2不同,则为真 [ "$myvar" != "one two three" ]

      • 算术比较运算符

      命令 说明 例子/备注
      num1-eq num2 等于 [ 3 -eq $mynum ]
      num1-ne num2 不等于 [ 3 -ne $mynum ]
      num1-lt num2 小于 [ 3 -lt $mynum ]
      num1-le num2 小于或等于 [ 3 -le $mynum ]
      num1-gt num2 大于 [ 3 -gt $mynum ]
      num1-ge num2 大于或等于 [ 3 -ge $mynum ]

    dpkg命令

    • 打包

      dpkg -b . demo.deb
      

      第一个参数为需要打包的目录路径("."为当前目录),第二个参数为deb包名

    • 安装

      dpkg -i demo.deb
      
    • 强制安装

      dpkg --force-depends -i demo.deb
      

      强制安装可能会有依赖问题,慎用。

    • 卸载

      dpkg -r demo
      

      删除包,但保留配置文件

      dpkg -P|--purge my-deb
      

      删除包和配置文件

    • 解包

      dpkg --unpack demo.deb
      
    • 查看deb包是否安装/deb包的信息

      dpkg -s demo
      
    • 查看deb包文件内容

      dpkg -c demo.deb
      
    • 解压deb中所要安装的文件

      dpkg -x  demo.deb demo
      

      第一个参数为所要解压的deb包,第二个参数为将deb包解压到指定的目录

    • 解压deb包中DEBIAN目录下的文件(至少包含control文件)

      dpkg -e demo.deb demo/DEBIAN
      
    • 列出与该包关联的文件

      dpkg -L demo
      
    • 配置软件包

      dpkg --configure demo
      
  • 相关阅读:
    Spring Boot中使用logback日志框架
    Java日志框架-logback配置文件参考(转)
    Java日志框架-logback配置文件多环境日志配置(开发、测试、生产)(原始解决方法)
    MySQL取每组的前N条记录
    跟大佬一起读源码:CurrentHashMap的扩容机制
    源码速读及点睛:HashMap
    求两个Linux文本文件的交集、差集、并集
    哪个先执行:@PostConstruct和@Bean的initMethod?
    Android Studio3.0 Error:Execution failed for task ':app:javaPreCompileDebug' 错误
    Android原生项目集成React Native
  • 原文地址:https://www.cnblogs.com/zwbsoft/p/15993342.html
Copyright © 2020-2023  润新知