将java应用打包成uos适用的deb包
系统后台使用spring boot开发,前端使用vue开发。使用国产数据库和容器(中间件)。
保证已经安装好了打包的软件
sudo apt install dh-make
sudo sudo apt-get install build-essential
2
# 第一步,配置好环境变量值
在主目录下的.bashrc
(如果你使用的bash shell)文件中加入如下三行,根据个人信息替换
//vi .bashrc
DEBFULLNAME="test"
DEBEMAIL="testadmin@test.cn"
export DEBFULLNAME DEBEMAIL
2
3
4
5
编辑完成.bashrc
后执行source ~/.bashrc
构建deb包可分为从源码编译构建和从二进制包直接构建,二进制包已有编译好的二进制程序,可直接运行,无需再编译,直接构建成deb包即可,本文讲从二进制包构建deb包
因为所有组件都是二进制文件,所以我们直接用二进制构建最终的包就可以了。默认情况下通用机的uos是没有jdk的,所以需要打包进去jre。
另外,提供一个软件源 (opens new window)供下载不同架构下的jdk
# 首先创建一个用来构建deb包的目录,目录要以 包名-版本号 的格式
mkdir -p cn.lisynet.app-1.0.0/cn.lisynet.app
1# 接下来构建一个规范的软件目录,用来按规则放其他的文件,完整的目录结构为:
//cd cn.lisynet.app-1.0.0 //tree cn.lisynet.app-1.0.0 cn.lisynet.app #此目录以包名命名 ├── entries #此目录必须有 │ ├── applications #放desktop文件,gui界面应用必须要有此目录和desktop文件 │ ├── autostart #放自启动入口文件 │ ├── icons #应用的图标文件,根据大小放进不同的目录下的apps/目录下,支持的分辨率包括:16/24/32/48/128/256/512,svg格式的放在scalable/apps/目录下,gui界面应用必须要有 │ │ └── hicolor │ │ ├── 16x16 │ │ │ └── apps │ │ ├── 24x24 │ │ │ └── apps │ │ ├── 32x32 │ │ │ └── apps │ │ ├── 48x48 │ │ │ └── apps │ │ ├── 128x128 │ │ │ └── apps │ │ ├── 256x256 │ │ │ └── apps │ │ ├── 512x512 │ │ │ └── apps ├── files #放其他文件 此目录必须有 └── info #json格式的应用信息,info文件必须有
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25将必要的文件放到files里面
# 写一个规范的info文件
info文件是应用的描述文件,使用
json
格式,完整的info文件格式如下:{ "appid": "com.deepin.demo", "name": "Demo", "version": "5.0.0.0", "arch": ["amd64", "mips64"], "permissions": { "autostart": false, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false }, "support-plugins": [ ], "plugins": [ ] }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21info文件中各个字段的说明如下:
appid:应用标识
name:应用名称
version:应用版本,格式为 {MAJOR}.{MINOR}.{PATCH}.{BUILD},所有版本号均为纯数字
arch:应用支持架构,当前商店支持如下CPU架构
- amd64:x86架构CPU - mips64el:龙芯系列CPU - arm64:ARM64位CPU - sw_64:申威CPU
permissions:应用权限描述。
- autostart:是否允许自启动 - notification:是否允许使用通知 - trayicon:是否运行显示托盘图标 - clipboard:是否允许使用剪切板 - account:是否允许读取登录用户信息 - bluetooth:是否允许使用蓝牙设备 - camera:是否允许使用视频设备 - audio_record:是否允许进行录音 - installed_apps:是否允许读取安装软件列表
support-plugins: 支持的插件类型
plugins:实现的的插件类型,在对应的plugins目录下,按照实现的插件类型放置文件。
在安装时,系统会将插件链接到对应的应用目录。
本软件info内容参考如下:
{ "appid": "cn.lisynet.app", "name": "app", "version": "1.0.0", "arch": ["amd64"], "permissions": { "autostart": true, "notification": false, "trayicon": false, "clipboard": false, "account": false, "bluetooth": false, "camera": false, "audio_record": false, "installed_apps": false } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 写一个desktop文件以包名.desktop为格式,放到application文件夹里面
//cn.lisynet.app.desktop [Desktop Entry] Name=myapp GenericName=Interface Designer Comment=myapp Exec=/opt/apps/cn.lisynet.app/files/start.sh Icon=/opt/cn.lisynet.app/icons/app.png MimeType=application/x-designer; Terminal=false Type=Application Categories=Utility;
1
2
3
4
5
6
7
8
9
10
11desktop官方文档 (opens new window)
desktop语法解释
[Desktop Entry] 文件头
Name 应用名称
Comment 软件描述信息
Exec 软件的可执行文件(可以是二进制或者脚本)
Icon 图标名
Terminal 是否使用终端
Type 启动器类型
Categories 应用的类型 可用的字段参考 (opens new window)
# 写一个自动启动的脚本,放到autostart里面
//cn.lisynet.app.service
[Unit]
Description=myapp
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/opt/apps/cn.lisynet.app/files/start.sh
ExecReload=/opt/apps/cn.lisynet.app/files/reload.sh
ExecStop=/opt/apps/cn.lisynet.app/files/stop.sh
[Install]
WantedBy=multi-user.target
2
3
4
5
6
7
8
9
10
11
12
13
14
//start.sh
#!/bin/bash
/bin/sleep 120
cd /opt/apps/cn.lisynet.app/files/webapp/bin&&./startservernohup.sh
2
3
4
# 进入cn.lisynet.app-1.0.0目录,使用 dh_make --createorig -s 命令创建debian目录,并在上层目录初始化出来源码包
dh_make --createorig -s
1确认信息无误输入y即可
当前目录下会自动创建debian目录,目录下有很多打包使用的模板文件,以.ex/.EX结尾,具体用途参考 模板文件参考 (opens new window),对于此软件包,我们不需要这些模板文件,所以全部删掉
然后修改control文件
对各个Control文件的具体描述说明,参考Control文件说明 (opens new window),我们本次打包,只需修改sections字段,homepage字段,Architecture字段,Description字段,修改完后如下格式
Source: cn.lisynet.app Section: devel Priority: optional Maintainer: test<test@test.cn> Build-Depends: debhelper (>= 11) Standards-Version: 4.1.3 Homepage: http://app.lisynet.cn Package: cn.lisynet.app Architecture: amd64 Depends: ${shlibs:Depends}, ${misc:Depends} Description: 测试系统 测试系统
1
2
3
4
5
6
7
8
9
10
11
12
13
14本次修改的几个字段解释
sections 为软件分类,字段值参考 sections字段值参考 (opens new window)
homepage 软件的主页的网址
Architecture 支持的架构,因为该二进制为64位,所以只用写amd64
descriptions 软件的描述信息
接下来在debian目录创建install文件,install文件可以指定各个文件的安装路径,官方文档 (opens new window) 本包的install文件参考:
cn.lisynet.app/ /opt/apps cn.lisynet.app/entries/applications/cn.lisynet.app.desktop /usr/share/applications cn.lisynet.app/entries/autostart/cn.lisynet.app.service /usr/lib/systemd/system
1
2
3因为是从二进制包构建的,不用编译和生成共享库等行为,所以我们可以在rules文件里覆盖掉这些指令,让他什么都不做,本包的rules文件参考如下:(出了标注出来的行,其他为默认生成) debian官方文档 (opens new window)
#!/usr/bin/make -f # See debhelper(7) (uncomment to enable) # output every command that modifies files on the build system. export DH_VERBOSE = 1 # see FEATURE AREAS in dpkg-buildflags(1) #export DEB_BUILD_MAINT_OPTIONS = hardening=+all # see ENVIRONMENT in dpkg-buildflags(1) # package maintainers to append CFLAGS #export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic # package maintainers to append LDFLAGS #export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed #for mutil-arch packages #source_tar = ../ #source_dir = ../ #ifneq ($(DEB_HOST_ARCH),amd64) # source_tar = ../ # source_dir = ../ #endif %: dh $@ override_dh_auto_build: #这是加入的行 override_dh_shlibdeps: #这是加入的行 override_dh_strip: #这是加入的行 # dh_make generated override targets # This is example for Cmake (See https://bugs.debian.org/641051 ) #override_dh_auto_configure: # dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39写一个
postinst
文件用来做安装后的处理#!/bin/bash chmod -R 755 /opt/apps/cn.lisynet.app/* cp /opt/apps/cn.lisynet.app/entries/apapplications/cn.lisynet.app.desktop /usr/share/applications cp /opt/apps/cn.lisynet.app/autostart/cn.lisynet.app.service /etc/systemd/system chmod -R 754 /opt/apps/cn.lisynet.app/autostart/cn.lisynet.app.service # 自启(根据需求设置) systemctl enable cn.lisynet.app.service # 启动(根据需求设置) systemctl start cn.lisynet.app.service
1
2
3
4
5
6
7
8
9
10
写一个prerm
文件用来做卸载时的处理
#!/bin/bash
systemctl disable cn.lisynet.app.service
systemctl stop cn.lisynet.app
2
3
4
接下来在cn.lisynet.app-1.0.0目录执行在 sudo dpkg-buildpackage -tc -uc -us -b
打出deb包
然后可以通过dpkg -i
测试安装 ,看软件包是否可以在启动器显示图标,正常运行即可