使用 jdeb 從 Java 建置建置 Debian deb 軟體包
1. 概述
在本教程中,我們將學習如何使用jdeb自動從 Java 建置建立deb檔案。首先,我們將了解deb檔案及其核心組成部分。然後,我們將介紹deb打包工具jdeb 。
最後,我們將使用 Maven 和 Ant 建立一個簡單的項目,以演示如何將jdeb整合到打包過程中。
2. DEB 文件結構
deb檔案包含程式安裝的所有必要元件。從本質上講,它是一個標準的 UNIX [ar](https://en.wikipedia.org/wiki/Ar_(Unix))歸檔文件,由三個核心成員組成:
debian-binary包含 Debian 軟體包格式,目前為 2.0 版。
control.tar.*歸檔檔案包含軟體包元資料和支援腳本。具體來說,它包含control文件,其中包含軟體包屬性,例如名稱、版本、架構、維護者、描述等等。這些腳本用作鉤子,可能會在安裝時或安裝後運行。除了腳本之外,它還可能包含 SysVinit 和 Systemd 等服務相關的文件。
data.tar.*檔案包含實際的軟體可安裝工件,其中包括庫、二進位、設定檔和手冊頁,這些檔案以組織有序的檔案層次結構呈現:
這些檔案會被提取到目標系統的根檔案系統中,並保留其層級結構。因此,如果這些檔案會修改根目錄,則安裝過程可能需要更高的權限。
手動建立這樣的deb檔案確實可行;但是,對於多個或複雜的構建,這種方法效率低且容易出錯。在接下來的章節中,我們將學習如何使用jdeb輕鬆地從 Java 建置中建立deb檔案。
3. jdeb包產生器
jdeb是一個函式庫,它提供了一個 Maven 外掛程式和一個 Ant 任務,可以跨平台地從 Java 建置產生deb檔。這意味著我們可以在 Windows 和 macOS 上建立deb文件,而無需使用 Debian 或其任何衍生發行版。
本質上,它對deb創建過程進行了抽象化。此外,它還能根據建置系統中定義的配置來填入control元資料檔。
此外,它支援壓縮並且是獨立的,因此我們不需要任何 UNIX 工具。
它在Maven Central上有售。
4. 包裝:Maven
jdeb提供了一個Maven 插件,可以將deb套件的建立直接整合到 Maven 建置生命週期中。我們可以在專案的pom.xml中進行設定。
通常情況下,我們會將其綁定到package階段並執行jdeb目標。此外,我們還需要定義control文件的包元資料以及將包含在data.tar文件中的文件集。
專案package完成後, deb檔案將與其他檔案一起產生。
4.1 建立 Maven 配置
為了示範我們的應用場景,我們將建立一個簡單的項目,用於列印當月的日曆:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.baeldung</groupId>
<artifactId>simple-cal</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<jdeb.version>1.14</jdeb.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.14.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.4.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.baeldung.simplecal.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<!-- jdeb plugin configuration -->
</plugins>
</build>
</project>
4.2. 插入和配置jdeb
要配置deb創建,我們需要熟悉以下幾個要素:
-
controlDir是包含控制檔案和腳本檔案的目錄。 -
dataSet包含將要放入 Debian 軟體包歸檔中的檔案和目錄清單。 -
deb指定deb軟體包檔案的名稱
基於此,我們可以為pom.xml中新增plugin條目:
<plugin>
<artifactId>jdeb</artifactId>
<groupId>org.vafer</groupId>
<version>${jdeb.version}</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>jdeb</goal>
</goals>
<configuration>
<controlDir>${basedir}/src/main/resources/deb/control</controlDir>
<dataSet>
<data>
<src>${project.build.directory}/${project.build.finalName}.jar</src>
<type>file</type>
<mapper>
<type>perm</type>
<prefix>/opt/${project.artifactId}</prefix>
</mapper>
</data>
<data>
<src>src/main/resources/${project.artifactId}</src>
<type>file</type>
<mapper>
<type>perm</type>
<prefix>/usr/bin</prefix>
<filemode>755</filemode>
</mapper>
</data>
<data>
<type>template</type>
<paths>
<path>/var/log/${project.artifactId}</path>
</paths>
</data>
</dataSet>
</configuration>
</execution>
</executions>
</plugin>
值得注意的是,我們指定了控制目錄,該jdeb位於資源目錄中。 jdeb 將從控製文件中讀取所需的元資料:
$ cat .\src\main\resources\deb\control\control
Package: simple-cal
Version: 1.0-SNAPSHOT
Section: utils
Priority: optional
Architecture: all
Depends: openjdk-25-jre
Maintainer: Haidar Ali <[email protected]>
Description: A CLI calendar that simply prints the current month.
此外,我們還使用了一些映射器,它們用於指定如何轉換軟體包內的檔案和目錄。具體來說,我們將完整的 JAR 檔案放在了/opt/simple-cal目錄中。
此外,我們還編寫了一個簡單的啟動器來啟動 JAR 檔案:
$ cat .\src\main\resources\simple-cal
#!/bin/sh
java -jar /opt/simple-cal/simple-cal-1.0-SNAPSHOT.jar "$@"
這是一個方便的包裝器,我們將其放在/usr/bin中,它將在 $PATH 中可用。
最後,我們指示jdeb創建/var/lib/simple-cal作為佔位符,並設定了正確的權限。這樣,程式在運行時如果需要,就可以使用它。此外,我們還可以建立其他類型的文件,例如符號連結、硬連結和設定檔。
4.3. 建置打包
配置完成後,我們就可以打包專案了:
$ mvn clean package
打包成功後,我們可以看到輸出日誌:
[INFO] --- jdeb:1.14:jdeb (default) @ simple-cal ---
[INFO] Creating debian package: C:\Users\Haidar Ali\GitHub\simple-cal\target\simple-cal_1.0~SNAPSHOT_all.deb
[INFO] Building conffiles
[INFO] Skipping 'conffiles' generation. No entries defined in maven/pom or ant/build.xml.
[INFO] Adding control: control
[INFO] Adding control: md5sums
[INFO] Creating changes file: C:\Users\Haidar Ali\GitHub\simple-cal\target\simple-cal_1.0~SNAPSHOT_all.changes
[INFO] Attaching created debian package C:\Users\Haidar Ali\GitHub\simple-cal\target\simple-cal_1.0~SNAPSHOT_all.deb
4.4 測試
現在我們可以將deb檔案匯入到基於 Debian 的系統中:
$ dpkg --info simple-cal_1.0snapshot_all.deb
new Debian package, version 2.0.
size 3774 bytes: control archive=397 bytes.
247 bytes, 9 lines control
130 bytes, 2 lines md5sums
Package: simple-cal
Version: 1.0-SNAPSHOT
Section: utils
Priority: optional
Architecture: all
Depends: openjdk-25-jre
Installed-Size: 3
Maintainer: Haidar Ali <[email protected]>
Description: A CLI calendar that simply prints the current month.
現在,我們只需使用dpkg安裝它即可:
$ sudo dpkg -i simple-cal_1.0snapshot_all.deb
安裝完成後,我們可以進行驗證:
$ whereis simple-cal
simple-cal: /usr/bin/simple-cal
現在,我們可以運行它了:
$ simple-cal
Mo Tu We Th Fr Sa Su
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*
5. 包裝:螞蟻
對於 Ant,我們需要在build.xml檔案中定義一個自訂任務<deb> :
a<?xml version="1.0" encoding="UTF-8"?>
<project name="simple-cal" default="deb" basedir=".">
<property name="app.name" value="simple-cal" />
<property name="app.version" value="1.0-SNAPSHOT" />
<property name="build.dir" location="target" />
<property name="dist.dir" location="${build.dir}/dist" />
<property name="control.dir" location="src/main/resources/deb/control" />
<path id="jdeb.classpath">
<fileset dir="lib" includes="jdeb-*.jar" />
</path>
<taskdef name="deb" classname="org.vafer.jdeb.ant.DebTask" classpathref="jdeb.classpath" />
<target name="deb" depends="jar">
<echo message="Creating Debian package ${app.name}_${app.version}_all.deb" />
<deb destFile="${build.dir}/${app.name}_${app.version}_all.deb" controlDir="${control.dir}"
name="${app.name}" version="${app.version}" revision="1" type="deb">
<data src="${build.dir}/${app.name}.jar" type="file">
<mapper type="perm" prefix="/usr/share/${app.name}" />
</data>
<data src="src/main/resources/${app.name}" type="file">
<mapper type="perm" prefix="/usr/bin" filemode="755" />
</data>
<data type="template">
<paths>
<path>/var/log/${app.name}</path>
</paths>
</data>
</deb>
</target>
<target name="jar">
<echo message="Creating JAR file (implementation omitted)" />
<mkdir dir="${build.dir}" />
<jar destfile="${build.dir}/${app.name}.jar"> </jar>
</target>
<target name="clean">
<delete dir="${build.dir}" />
</target>
</project>
在這裡,我們定義了<deb>任務,它告訴 Ant 在哪裡可以找到jdeb Ant Task 類別。類似地,我們也定義了包元資料和文件,就像在 Maven 配置中一樣。
現在,所有目錄和檔案都已設定完畢,我們可以建立deb檔案了:
$ ant deb
請注意,我們需要下載jdeb JAR 及其相依性並將其放入首選類別路徑中,在本例中,該類別路徑是lib目錄。
6. 結論
本文介紹如何在 Maven 和 Ant 建置過程中使用jdeb輕鬆建立deb檔案。我們希望本文能為建構更複雜、更專業的 Linux 軟體包分發工作流程提供一個良好的起點。