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


    环境和源文件

    • 净室环境:

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

    • 净室环境系统:
      本次使用系统环境为 CentOS Linux release 7.9.2009 (Core)


    • 源文件结构树:

      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
      ├── res                 --资源文件夹
      │   └── Favs.ico        --图标ico文件
      ├── resources
      ├── resources.pak
      ├── scripts
      │   ├── demo.service    --Linux服务(后续有详解)
      │   ├── rpminstall.sh   --安装时需要执行的脚本
      │   └── rpmuninstall.sh --卸载时需要执行的脚本
      ├── server              --Java服务
      │   ├── demo.jar        --Java服务jar包
      │   └── jre             --jre运行环境
      ├── snapshot_blob.bin
      ├── swiftshader
      ├── 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 指定环境变量
    • rpminstall.sh脚本内容(安装后执行脚本)

      #!/bin/bash
      
      #change directory to script path
      curpath=$(cd "$(dirname "$0")"; pwd)
      cd $curpath > /dev/null
      
      #kill all runing demo
      killall demo
      
      #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/
      
      
    • rpmuninstall.sh脚本内容(卸载后执行脚本)

      #!/bin/bash
      
      #change directory to script path
      curpath=$(cd "$(dirname "$0")"; pwd)
      cd $curpath > /dev/null
      
      systemctl stop demo.service
      
      systemctl disable demo.service
      
      rm /etc/systemd/system/demo.service > /dev/null 2>&1
      
      

    rpm打包

    • 环境准备

      RPM打包使用的是rpmbuild命令,这个命令来自rpm-build包,这个是必装的。

      yum install rpm-build
      

      (推荐)也可以直接安装rpmdevtools,这个工具还包含一些其他的工具,同时它依赖rpm-build,所以直接安装的话会同时把rpm-build装上。

      yum install rpmdevtools
      
    • 创建rpm工作空间

      RPM打包的时候需要编译源码,还需要把编译好的配置文件啊二进制命令文件啊之类的东西按照安装好的样子放到合适的位置,还要根据需要对RPM的包进行测试,这些都需要先有一个“工作空间”。rpmbuild命令使用一套标准化的“工作空间”:

      rpmdev-setuptree
      

      rpmdev-setuptree这个命令就是安装rpmdevtools带来的。可以看到运行了这个命令之后,在$HOME家目录下多了一个叫做rpmbuild的文件夹,里边内容如下:

      # cd $HOME
      # tree rpmbuild/
      
      rpmbuild/
      ├── BUILD
      ├── RPMS
      ├── SOURCES
      ├── SPECS
      └── SRPMS
      

      如果没有安装rpmdevtools的话,也可以手动通过命令mkdir创建这些文件夹

      mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
      
    • rpmbuild详解

      默认位置 宏代码 名称 用途
      ~/rpmbuild/SPECS %_specdir Spec 文件目录 保存 RPM 包配置(.spec)文件
      ~/rpmbuild/SOURCES %_sourcedir 源代码目录保存源码包(如 .tar 包)和所有 patch 补丁
      ~/rpmbuild/BUILD %_builddir 构建目录源码包被解压至此,并在该目录的子目录完成编译
      ~/rpmbuild/BUILDROOT %_buildrootdir 最终安装目录 保存 %install 阶段安装的文件
      ~/rpmbuild/RPMS %_rpmdir 标准 RPM 包目录 生成/保存二进制 RPM 包
      ~/rpmbuild/SRPMS %_srcrpmdir 源代码 RPM 包目录 生成/保存源码 RPM 包(SRPM)
    • 配置rpmbuild

      由于本次打包是有electron构建好的项目,这里不需要通过源码再进行构建,所以我们只需要BUILDROOT(最终安装目录,也就是想要将项目安装到的目录)和SPECS(配置)两个路径,取余不用管。

      由于工具没有自动生成BUILDROOT,所以这里需要手动创建BUILDROOT文件夹

      mkdir $HOME/rpmbuild/BUILDROOT
      
      • 构建SPECS

      在SPECS里新建一个demo.spec

       vi $HOME/SPECS/demo.spec
      

      demo.spec内容:

      # rpmrebuild autogenerated specfile
      
      BuildArch:     x86_64
      Name:          demo
      Version:       1.0.0
      Release:       1%{?dist}
      License:       GPL
      Summary:       This is Demo
      
      
      %description
      demo for linux
      %files
      %post -p /bin/sh
      bash /usr/local/demo/scripts/rpminstall.sh
      %preun -p /bin/sh
      bash /usr/local/demo/scripts/rpmuninstall.sh
      %changelog
      

      编辑完保存


      • spec详解

      字段 说明
      Name 软件包的名称,后面可使用%{name}的方式引用
      Summary 软件包的内容概要
      Version 软件的实际版本号,例如:1.0.1等,后面可使用%{version}引用
      Release 发布序列号,例如:1linuxing等,标明第几次打包,后面可使用%{release}引用
      Group 软件分组,建议使用标准分组
      License 软件授权方式,通常就是GPL
      Source 源代码包,可以带多个用Source1、Source2等源,后面也可以用%{source1}、%{source2}引用
      BuildRoot 这个是安装或编译时使用的“虚拟目录”,考虑到多用户的环境,一般定义为:%{_tmppath}/%{name}-%{version}-%{release}-root或%{_tmppath}/%{name}-%{version}-%{release}-buildroot-%(%{__id_u} -n}该参数非常重要,因为在生成rpm的过程中,执行make install时就会把软件安装到上述的路径中,在打包的时候,同样依赖“虚拟目录”为“根目录”进行操作。后面可使用$RPM_BUILD_ROOT 方式引用。
      URL 软件的主页
      Vendor 发行商或打包组织的信息,例如RedFlag Co,Ltd
      Disstribution 发行版标识
      Patch 补丁源码,可使用Patch1、Patch2等标识多个补丁,使用%patch0或%{patch0}引用
      Prefix %{_prefix} 这个主要是为了解决今后安装rpm包时,并不一定把软件安装到rpm中打包的目录的情况。这样,必须在这里定义该标识,并在编写%install脚本的时候引用,才能实现rpm安装时重新指定位置的功能
      Prefix %{_sysconfdir} 这个原因和上面的一样,但由于%{_prefix}指/usr,而对于其他的文件,例如/etc下的配置文件,则需要用%{_sysconfdir}标识
      Build Arch 指编译的目标处理器架构,noarch标识不指定,但通常都是以/usr/lib/rpm/marcros中的内容为默认值
      Requires 该rpm包所依赖的软件包名称,可以用>=或<=表示大于或小于某一特定版本,例如:libpng-devel >= 1.0.20 zlib ※“>=”号两边需用空格隔开,而不同软件名称也用空格分开还有例如PreReq、Requires(pre)、Requires(post)、Requires(preun)、Requires(postun)、BuildRequires等都是针对不同阶段的依赖指定
      Provides 指明本软件一些特定的功能,以便其他rpm识别
      Packager 打包者的信息
      %description 软件的详细说明

      • spec脚本

      字段 说明
      %prep 预处理脚本
      %setup -n %{name}-%{version} 把源码包解压并放好通常是从/usr/src/asianux/SOURCES里的包解压到/usr/src/asianux/BUILD/%{name}-%{version}中。一般用%setup -c就可以了,但有两种情况:一就是同时编译多个源码包,二就是源码的tar包的名称与解压出来的目录不一致,此时,就需要使用-n参数指定一下了。
      %patch 打补丁通常补丁都会一起在源码tar.gz包中,或放到SOURCES目录下。一般参数为:%patch -p1 使用前面定义的Patch补丁进行,-p1是忽略patch的第一层目录
      %Patch2 -p1 -b xxx.patch 打上指定的补丁,-b是指生成备份文件
      %setup 不加任何选项,仅将软件包打开。
      %setup -n newdir 将软件包解压在newdir目录。
      %setup -c 解压缩之前先产生目录。
      %setup -b num 将第num个source文件解压缩。
      %setup -T 不使用default的解压缩操作。
      %setup -T -b 0 将第0个源代码文件解压缩。
      %setup -c -n newdir 指定目录名称newdir,并在此目录产生rpm套件。
      %patch 最简单的补丁方式,自动指定patch level。
      %patch 0 使用第0个补丁文件,相当于%patch ?p 0。
      %patch -s 不显示打补丁时的信息。
      %patch -T 将所有打补丁时产生的输出文件删除。
      %configure 这个不是关键字,而是rpm定义的标准宏命令。意思是执行源代码的configure配置在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行 ,使用标准写法,会引用/usr/lib/rpm/marcros中定义的参数。另一种不标准的写法是,可参考源码中的参数自定义,例如:CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" ./configure --prefix=%{_prefix}
      %build 开始构建包在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make的工作 ,常见写法:make %{?_smp_mflags} OPTIMIZE="%{optflags}"都是一些优化参数,定义在/usr/lib/rpm/marcros中
      %install 开始把软件安装到虚拟的根目录中在/usr/src/asianux/BUILD/%{name}-%{version}目录中进行make install的操作。这个很重要,因为如果这里的路径不对的话,则下面%file中寻找文件的时候就会失败。 常见内容有:
      %makeinstall 这不是关键字,而是rpm定义的标准宏命令。也可以使用非标准写法:make DESTDIR=$RPM_BUILD_ROOT install或make prefix=$RPM_BUILD_ROOT install,需要说明的是,这里的%install主要就是为了后面的%file服务的。所以,还可以使用常规的系统命令:install -d $RPM_BUILD_ROOT/ ;cp -a * $RPM_BUILD_ROOT/
      %clean 清理临时文件通常内容为:[ "$RPM_BUILD_ROOT" != "/" ] && rm -rf "$RPM_BUILD_ROOT" ;rm -rf $RPM_BUILD_DIR/%{name}-%{version}※注意区分$RPM_BUILD_ROOT和$RPM_BUILD_DIR:$RPM_BUILD_ROOT是指开头定义的BuildRoot,而$RPM_BUILD_DIR通常就是指/usr/src/asianux/BUILD,其中,前面的才是%file需要的。
      %pre rpm 安装前执行的脚本
      %post rpm 安装后执行的脚本
      %preun rpm 卸载前执行的脚本
      %postun rpm 卸载后执行的脚本
      %files 定义那些文件或目录会放入rpm中这里会在虚拟根目录下进行,千万不要写绝对路径,而应用宏或变量表示相对路径。 如果描述为目录,表示目录中除%exclude外的所有文件。
      %defattr (-,root,root) 指定包装文件的属性,分别是(mode,owner,group),-表示默认值,对文本文件是0644,可执行文件是0755
      %exclude 列出不想打包到rpm中的文件※小心,如果%exclude指定的文件不存在,也会出错的。
      %changelog 变更日志

      • 当前rpmbuild目录树

      rpmbuild
      ├── BUILD
      ├── BUILDROOT
      │   └── usr
      │       ├── local
      │       │   └── demo
      │       └── share
      │           └── applications
      │               └── demo.desktop
      ├── RPMS
      ├── SOURCES
      ├── SPECS
      │   └── demo.spec
      └── SRPMS
      
      

      • 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:系统管理;

    • 开始试着打包


      在 rpmbuild/SPECS目录中执行以下命令

      rpmbuild -bb demo.spec
      

      此时会报错

      [root@localhost SPECS]# rpmbuild -bb demo.spec 
      处理文件:demo-1.0.0-1.el7.x86_64
      Provides: demo = 1.0.0-1.el7 demo(x86-64) = 1.0.0-1.el7
      Requires(interp): /bin/sh /bin/sh
      Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
      Requires(post): /bin/sh
      Requires(preun): /bin/sh
      检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64
      写道:/root/rpmbuild/RPMS/x86_64/demo-1.0.0-1.el7.x86_64.rpm
      执行(%clean): /bin/sh -e /var/tmp/rpm-tmp.uPYNbL
      + umask 022
      + cd /root/rpmbuild/BUILD
      + /usr/bin/rm -rf /root/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64
      + exit 0
      
      

      这部其实主要是路径问题,没有相应的路径/root/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64, 创建这个路径即可,然后将当前BUILDROOT/user 放到创建的路径下即可。

      # mkdir $HOME/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64
      # mv $HOME/rpmbuild/BUILDROOT/usr $HOME/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64
      

      再次尝试打包

      [root@localhost SPECS]# rpmbuild -bb demo.spec 
      处理文件:demo-1.0.0-1.el7.x86_64
      Provides: demo = 1.0.0-1.el7 demo(x86-64) = 1.0.0-1.el7
      Requires(interp): /bin/sh /bin/sh
      Requires(rpmlib): rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rpmlib(CompressedFileNames) <= 3.0.4-1
      Requires(post): /bin/sh /bin/sh
      Requires(preun): /bin/sh /bin/sh
      检查未打包文件:/usr/lib/rpm/check-files /root/rpmbuild/BUILDROOT/demo-1.0.0-1.el7.x86_64
      错误:发现已安装(但未打包的)文件:
         /usr/local/demo/LICENSE.electron.txt
         /usr/local/demo/LICENSES.chromium.html
         /usr/local/demo/chrome-sandbox
         /usr/local/demo/chrome_100_percent.pak
         /usr/local/demo/chrome_200_percent.pak
         /usr/local/demo/chrome_crashpad_handler
                  		.
                  		.
                  		.
      

      还是报错,此报错就是demo.spec中%files下没有将要打包的文件添加进去,修改demo.spec文件。
      完整demo.spec文件:

      展开查看
        # rpmrebuild autogenerated specfile
      
        BuildArch:     x86_64
        Name:          demo
        Version:       1.0.0
        Release:       1%{?dist}
        License:       GPL
        Summary:       This is Demo
        
        Requires:      /bin/sh  
        Requires:      /bin/sh  
        
        %description
        demo for linux
        %files
        %attr(0755, root, root) "/usr/share/applications/demo.desktop"
        %dir %attr(0755, root, root) "/usr/local/demo"
        %attr(4755, root, root) "/usr/local/demo/chrome-sandbox"
        %attr(0755, root, root) "/usr/local/demo/LICENSE.electron.txt"
        %attr(0755, root, root) "/usr/local/demo/LICENSES.chromium.html"
        %attr(0755, root, root) "/usr/local/demo/chrome_100_percent.pak"
        %attr(0755, root, root) "/usr/local/demo/chrome_200_percent.pak"
        %attr(0755, root, root) "/usr/local/demo/chrome_crashpad_handler"
        %attr(0755, root, root) "/usr/local/demo/demo"
        %attr(0755, root, root) "/usr/local/demo/icudtl.dat"
        %attr(0755, root, root) "/usr/local/demo/libEGL.so"
        %attr(0755, root, root) "/usr/local/demo/libGLESv2.so"
        %attr(0755, root, root) "/usr/local/demo/libffmpeg.so"
        %attr(0755, root, root) "/usr/local/demo/libvk_swiftshader.so"
        %attr(0755, root, root) "/usr/local/demo/libvulkan.so.1"
        %attr(0755, root, root) "/usr/local/demo/locales/am.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ar.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/bg.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/bn.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ca.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/cs.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/da.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/de.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/el.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/en-GB.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/en-US.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/es-419.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/es.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/et.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/fa.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/fi.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/fil.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/fr.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/gu.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/he.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/hi.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/hr.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/hu.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/id.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/it.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ja.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/kn.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ko.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/lt.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/lv.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ml.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/mr.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ms.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/nb.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/nl.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/pl.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/pt-BR.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/pt-PT.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ro.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ru.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/sk.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/sl.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/sr.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/sv.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/sw.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/ta.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/te.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/th.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/tr.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/uk.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/vi.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/zh-CN.pak"
        %attr(0755, root, root) "/usr/local/demo/locales/zh-TW.pak"
        %attr(0755, root, root) "/usr/local/demo/resources.pak"
        %attr(0755, root, root) "/usr/local/demo/resources/app.asar"
        %attr(0755, root, root) "/usr/local/demo/scripts/demo.service"
        %attr(0755, root, root) "/usr/local/demo/scripts/rpminstall.sh"
        %attr(0755, root, root) "/usr/local/demo/scripts/rpmuninstall.sh"
        %attr(0755, root, root) "/usr/local/demo/server/demo.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/ADDITIONAL_LICENSE_INFO"
        %attr(0755, root, root) "/usr/local/demo/server/jre/ASSEMBLY_EXCEPTION"
        %attr(0755, root, root) "/usr/local/demo/server/jre/LICENSE"
        %attr(0755, root, root) "/usr/local/demo/server/jre/THIRD_PARTY_README"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/java"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/jjs"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/keytool"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/orbd"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/pack200"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/policytool"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/rmid"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/rmiregistry"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/servertool"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/tnameserv"
        %attr(0755, root, root) "/usr/local/demo/server/jre/bin/unpack200"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/jli/libjli.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/jli/libjli.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/jvm.cfg"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libattach.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libattach.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt_headless.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt_headless.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt_xawt.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libawt_xawt.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libdt_socket.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libdt_socket.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libfontmanager.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libfontmanager.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libhprof.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libhprof.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libinstrument.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libinstrument.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2gss.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2gss.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2pcsc.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2pcsc.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2pkcs11.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libj2pkcs11.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjaas_unix.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjaas_unix.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjava.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjava.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjava_crw_demo.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjava_crw_demo.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjawt.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjawt.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjdwp.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjdwp.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjpeg.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjpeg.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsdt.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsdt.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsig.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsig.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsound.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsound.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsoundalsa.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libjsoundalsa.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/liblcms.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/liblcms.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libmanagement.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libmanagement.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libmlib_image.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libmlib_image.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnet.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnet.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnio.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnio.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnpt.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libnpt.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsaproc.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsaproc.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsctp.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsctp.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsplashscreen.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsplashscreen.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsunec.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libsunec.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libunpack.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libunpack.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libverify.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libverify.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libzip.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/libzip.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/server/Xusage.txt"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/server/libjsig.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/server/libjsig.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/server/libjvm.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/amd64/server/libjvm.so"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/calendars.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/charsets.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/classlist"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/cmm/CIEXYZ.pf"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/cmm/GRAY.pf"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/cmm/LINEAR_RGB.pf"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/cmm/PYCC.pf"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/cmm/sRGB.pf"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/content-types.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/currency.data"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/cldrdata.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/dnsns.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/localedata.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/meta-index"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/nashorn.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/sunec.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/sunjce_provider.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/sunpkcs11.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/ext/zipfs.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/flavormap.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/hijrah-config-umalqura.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/cursors.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/invalid32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_CopyDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_CopyNoDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_LinkDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_LinkNoDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_MoveDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/images/cursors/motif_MoveNoDrop32x32.gif"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/jce.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/jexec"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/jexec.diz"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/jsse.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/jvm.hprof.txt"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/logging.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/management-agent.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/management/jmxremote.access"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/management/jmxremote.password.template"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/management/management.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/management/snmp.acl.template"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/meta-index"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/net.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/psfont.properties.ja"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/psfontj2d.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/resources.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/rt.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/US_export_policy.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/blacklisted.certs"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/cacerts"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/java.policy"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/java.security"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/security/local_policy.jar"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/sound.properties"
        %attr(0755, root, root) "/usr/local/demo/server/jre/lib/tzdb.dat"
        %attr(0755, root, root) "/usr/local/demo/snapshot_blob.bin"
        %attr(0755, root, root) "/usr/local/demo/swiftshader/libEGL.so"
        %attr(0755, root, root) "/usr/local/demo/swiftshader/libGLESv2.so"
        %attr(0755, root, root) "/usr/local/demo/res/Favs.ico"
        %attr(0755, root, root) "/usr/local/demo/v8_context_snapshot.bin"
        %attr(0755, root, root) "/usr/local/demo/vk_swiftshader_icd.json"
        
        %post -p /bin/sh
        bash /usr/local/demo/scripts/rpminstall.sh
        %preun -p /bin/sh
        bash /usr/local/demo/scripts/rpmuninstall.sh
        %changelog
      
      

      修改还再次打包即可,打包后 $HOME/rpmbuild/RPMS下会生成相应的rpm包

    • 补充:


      • 文件比较运算符

      命令 说明 例子/备注
      -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 ]
  • 相关阅读:
    [CF1028D] Order book
    初入python,与同学者的第一次见面(小激动)
    jira与mysql的配合搭建调整
    linux内置的审计跟踪工具------last和lastb
    rman
    nginx和apache的一些比较
    NYOJ128前缀式计算
    NYOJ2括号配对问题
    大数加减乘以及高精度幂
    在不同的页面之间通过查询字符串传递信息
  • 原文地址:https://www.cnblogs.com/zwbsoft/p/15994806.html
Copyright © 2020-2023  润新知