jdeb – ์ž๋ฐ” ๋นŒ๋“œ๋กœ debian package ๋งŒ๋“ค๊ธฐ

Java์™€ Spring Boot๋ฅผ ์ฃผ๋ ฅ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๋งŽ์€ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฐฐํฌ๋Š” ํ•ญ์ƒ ์ค‘์š”ํ•œ ๊ณผ์ œ๋‹ค. JAR ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ๋ฆฌ๋ˆ…์Šค ์„œ๋ฒ„์— ์˜ฌ๋ฆฐ ๋’ค ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์งœ์„œ ์‹คํ–‰ํ•˜๊ณ  Systemd ์„œ๋น„์Šค๋กœ ๋“ฑ๋กํ•˜๋Š” ๊ณผ์ •์€ ์ƒ๊ฐ๋ณด๋‹ค ์†์ด ๋งŽ์ด ๊ฐ€๋Š” ์ผ์ด๋‹ค.
์ด๋ฒˆ์— Baeldung์—์„œ ์†Œ๊ฐœ๋œ ‘jdeb๋ฅผ ํ™œ์šฉํ•œ Java ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค ๊ฐœ์„ ’ ๊ธฐ์‚ฌ๋ฅผ ๋ณด๊ณ  ์ด๋Ÿฌํ•œ ๋ฐฐํฌ ๊ณผ์ •์„ ๋‹จ์ˆœํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ์†”๋ฃจ์…˜์ด ์žˆ์–ด์„œ ๊ฐ„๋‹จํžˆ ์ •๋ฆฌํ•ด ๋ดค๋‹ค.

jdeb ์ฃผ๋ชฉํ•ด์•ผ ํ•  ๊ธฐ๋Šฅ 3๊ฐ€์ง€

jdeb๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ java ํ”„๋กœ์ ํŠธ์˜ JAR ํŒŒ์ผ์„ Debian ํŒจํ‚ค์ง€ (ํ”ํžˆ Ubuntu๋‚˜ Debian ๊ณ„์—ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์„ค์น˜ ํŒŒ์ผ)๋กœ ๋ณ€ํ™˜ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค.

ํฌ๋กœ์Šค ํ”Œ๋žซํผ ‘.deb’ ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์ง€์›

๊ธฐ์กด์—๋Š” deb ํŒจํ‚ค์ง€๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ๋ณดํ†ต Debian ๋˜๋Š” Ubuntu ๊ฐ™์€ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ (ํ˜น์€ VM)์ด ํ•„์š”ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ jdeb๋Š” ์ˆœ์ˆ˜ java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๋™์ž‘ํ•˜๋ฉฐ ๋ณ„๋„์˜ UNIX ์œ ํ‹ธ๋ฆฌํ‹ฐ ์—†์ด๋„ Windows๋‚˜ macOS ๊ฐ™์€ ํ™˜๊ฒฝ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ deb ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ์ œ์•ฝ์„ ํฌ๊ฒŒ ์ค„์—ฌ์ค€๋‹ค.

Maven ๋ฐ Gradle, Ant ๋นŒ๋“œ ์‚ฌ์ดํด์— ์™„๋ฒฝ ํ†ตํ•ฉ

jdeb๋Š” Maven Plugin๊ณผ Ant Task๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ•œ๋‹ค. Ant Task๋ฅผ ์ด์šฉํ•˜์—ฌ Gradle์—์„œ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  • Maven: pom.xml ๋‚ด์˜ <plugin> ์„ค์ •์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ถ”๊ฐ€๋˜๋ฉฐ ๋ณดํ†ต package ๋นŒ๋“œ ํŽ˜์ด์ฆˆ์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ JAR ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ์งํ›„์— deb ํŒจํ‚ค์ง€๊ฐ€ ์ž๋™ ์ƒ์„ฑ๋˜๋„๋ก ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Ant: <dev> ํƒœ์Šคํฌ ์ •์˜๋ฅผ ํ†ตํ•ด ๋นŒ๋“œ ํŒŒ์ผ์— ํ†ตํ•ฉ๋œ๋‹ค.
  • Gradle: jdeb์˜ Ant Task ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์™€์„œ ์œ ์—ฐํ•˜๊ฒŒ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง๊ด€์ ์ธ ํŒŒ์ผ ๊ณ„์ธต ๊ตฌ์กฐ ๋งคํ•‘ (dataSet๊ณผ mapper)

deb ํŒŒ์ผ ๋‚ด๋ถ€์—๋Š” ํŒจํ‚ค์ง€ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด control.tar์™€ ์‹ค์ œ ์„ค์น˜ ํŒŒ์ผ์ด ๋‹ด๊ธด data.tar๊ฐ€ ์กด์žฌํ•œ๋‹ค. jdeb๋Š” ์ด ์ค‘ data.tar์— ๋“ค์–ด๊ฐˆ ํŒŒ์ผ์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ dataSet๊ณผ mapper๋ฅผ ํ†ตํ•ด์„œ ์ถ”์ƒํ™”ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์ตœ์ข… JARํŒŒ์ผ์„ /opt/myapp์— ๋„ฃ๊ฑฐ๋‚˜ ์‹คํ–‰ ์Šคํฌ๋ฆฝํŠธ(Launcher)๋ฅผ /usr/bin์— ๋„ฃ๋Š” ๋“ฑ์˜ ๋ณต์žกํ•œ ๋ฆฌ๋ˆ…์Šค ๊ฒฝ๋กœ ์„ค์ •์€ Maven/Ant ์„ค์ • ํŒŒ์ผ ๋‚ด์—์„œ ์ง๊ด€์ ์ธ XML/Task ์ •์˜๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ control ํŒŒ์ผ์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํŒจํ‚ค์ง€๋ช…, ๋ฒ„์ „, ์˜์กด์„ฑ ๋“ฑ) ์ •์˜๋ฅผ ์ง€์›ํ•˜์—ฌ ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ์˜ ์˜ค๋ฅ˜๋ฅผ ์ค„์—ฌ์ค€๋‹ค.

jdeb ์‚ฌ์šฉ ๋ฐฉ๋ฒ•

Maven๊ณผ Gradle์—์„œ ์–ด๋–ป๊ฒŒ jdeb๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ deb ํŒจํ‚ค์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด ๋ณด์ž.

  • deb ํŒจํ‚ค์ง€๋ช… : deb-test-app
  • FAT JAR ํŒŒ์ผ๋ช… : spring-boot-jdeb.jar
  • systemd service : my-app

jdeb-Maven

jdeb๋Š” Maven ๋นŒ๋“œ ๋ผ์ดํ”„์‚ฌ์ดํด์— deb ํŒจํ‚ค์ง€ ์ƒ์„ฑ์„ ์ง์ ‘ ํ†ตํ•ฉํ•˜๋Š” Maven ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ์˜ pom.xml์—์„œ ์ด๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ํŒจํ‚ค์ง• ๋‹จ๊ณ„์— ๋ฐ”์ธ๋”ฉํ•˜๊ณ  jdeb goal์„ ์‹คํ–‰ํ•œ๋‹ค. ํŒจํ‚ค์ง€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์™€ data.tar ์•„์นด์ด๋ธŒ์— ํฌํ•จํ•  ํŒŒ์ผ ์„ธํŠธ๋ฅผ ์ •์˜ํ•ด์•ผ ํ•œ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ํŒจํ‚ค์ง•ํ•˜๋ฉด deb ํŒŒ์ผ์ด ๋‹ค๋ฅธ ์•„ํ‹ฐํŒฉํŠธ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ๋œ๋‹ค.

deb ํŒจํ‚ค์ง€ ๊ตฌ์„ฑ์— ํ•„์š”ํ•œ ํŒŒ์ผ ์œ„์น˜

jdeb ์ƒ˜ํ”Œ ํŒŒ์ผ ๊ตฌ์„ฑ
deb ๊ตฌ์„ฑ์„ ์œ„ํ•œ ํŒŒ์ผ ์œ„์น˜

deb ํŒจํ‚ค์ง€ ์„ค์น˜ ๋ฐ ์‚ญ์ œ์‹œ ์‹คํ–‰๋  ์Šคํฌ๋ฆฝํŠธ ์œ„์น˜๋Š” src/main/resources/deb/control ์ด๋‹ค.
deb ํŒจํ‚ค์ง€ ์„ค์น˜์‹œ systemd์— ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ service ํŒŒ์ผ์œ„์น˜๋Š” src/main/resources/deb/systemd ์ด๋‹ค.
ํŒŒ์ผ ์œ„์น˜๋Š” ๊ผญ resources์— ์žˆ์„ ํ•„์š”๋Š” ์—†๋‹ค. src/deb ๋ฐ‘์— ๊ตฌ์„ฑํ•ด๋„ ๋˜๊ณ .. ๊ฒฝ๋กœ ์„ค์ •๋งŒ ์ž˜ ๋งž์ถ”๋ฉด ๋œ๋‹ค.

control ํŒŒ์ผ ์ƒ์„ฑ

๋จผ์ € ํŒจํ‚ค์ง€์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค.
ํŒŒ์ผ ๊ฒฝ๋กœ๋Š” src/main/resources/deb/control/control ์ด๋ผ๊ณ  ํ•ด๋ณด์ž.

Package: deb-test-app
Version: 1.0.0
Section: misc
Priority: optional
Architecture: all
Maintainer: My Name <my.email@example.com>
Description: This is my Spring Boot Application package
 distribution via jdeb.
Plaintext

control์— ํ•„์š”ํ•œ ํ•„๋“œ ์ •๋ณด๋Š” https://www.debian.org/doc/debian-policy/ch-controlfields.html๋ฅผ ์ฐธ์กฐ.
์œ„ ์˜ˆ์—์„œ ํŒจํ‚ค์ง€ ๋ช…์€ dep-test-app ์ด๋‹ค.

postinst ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ

deb ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด ์„ค์น˜๋œ ์ดํ›„์— ์‹คํ–‰๋  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ •์˜ํ–ˆ๋‹ค. ์ด๋ฆ„์€ postinst ๋กœ ๋งž์ถฐ์•ผ ํ•œ๋‹ค.

#!/bin/sh
# ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด /opt/myapp์— ์„ค์น˜๋œ ์งํ›„ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ
# ์—๋Ÿฌ ๋ฐœ์ƒ ์‹œ ์ค‘๋‹จ
set -e

# ์„ค์น˜(configure) ๋‹จ๊ณ„์ผ ๋•Œ๋งŒ ์‹คํ–‰
if [ "$1" = "configure" ]; then
    echo "Systemd ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ์žฌ์‹œ์ž‘ ์ค‘..."

    # 1. systemd ์„ค์ • ์ƒˆ๋กœ๊ณ ์นจ (์ƒˆ๋กœ์šด .service ํŒŒ์ผ ์ธ์‹)
    if command -v systemctl >/dev/null; then
        sudo systemctl daemon-reload

        # 2. ๋ถ€ํŒ… ์‹œ ์ž๋™ ์‹คํ–‰ ๋“ฑ๋ก
        sudo systemctl enable my-app

        # 3. ์„œ๋น„์Šค (์žฌ)์‹œ์ž‘
        sudo systemctl restart my-app
    fi

    # 4. ๊ถŒํ•œ ๋ณด์ • (ํ•„์š”ํ•œ ๊ฒฝ์šฐ)
    chown -R root:root /opt/myapp
fi

exit 0
Bash

์œ„ ์˜ˆ์—์„œ systemd ์„œ๋น„์Šค๋ช…์€ my-app ์ด๋‹ค.

prerm ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ

deb ํŒจํ‚ค์ง€๊ฐ€ ์ œ๊ฑฐ ๋˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œ ๋˜๋Š” ๊ฒฝ์šฐ ์‹คํ–‰๋˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋‹ค.

#!/bin/sh
# ํŒจํ‚ค์ง€๋ฅผ ์‚ญ์ œ(remove) ํ•˜๊ฑฐ๋‚˜ ์—…๊ทธ๋ ˆ์ด๋“œ ์ง์ „์— ์‹คํ–‰๋จ
set -e

# ์‚ญ์ œ(remove) ๋˜๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ(upgrade) ์ „ ์‹คํ–‰
if [ "$1" = "remove" ] || [ "$1" = "upgrade" ]; then
    echo "์„œ๋น„์Šค ์ค‘์ง€ ์ค‘..."

    if command -v systemctl >/dev/null; then
        sudo systemctl stop my-app
    fi
fi

exit 0
Bash

systemd service ๋“ฑ๋ก ํŒŒ์ผ

[Unit]
Description=My Spring Boot Application
After=syslog.target

[Service]
User=root
# ์‹ค์ œ ์„ค์น˜๋  ๊ฒฝ๋กœ๋ฅผ ์ ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!
ExecStart=/usr/bin/java -jar /opt/myapp/spring-boot-jdeb.jar
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
Bash

์œ„ ์˜ˆ์—์„œ fat jar ํŒŒ์ผ๋ช…์€ spring-boot-jdeb.jar ์ด๋‹ค.

pom.xml plugin ์„ค์ •

<plugin>
    <groupId>org.vafer</groupId>
    <artifactId>jdeb</artifactId>
    <version>1.14</version>
    <executions>
        <execution>
            <phase>package</phase>
            <goals><goal>jdeb</goal></goals>
            <configuration>
                <!-- control ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•œ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ์ง€์ •ํ•˜๋Š” ๊ฒƒ์— ์œ ์˜!! -->
                <controlDir>${project.basedir}/src/main/resources/deb/control</controlDir>
                <!-- ๋ฐฐํฌํ•  ํŒŒ์ผ๋“ค์„ dataSet์— ์ •์˜ํ•œ๋‹ค. -->
                <dataSet>
                    <data>
                        <!-- systemd service ๋“ฑ๋ก ํŒŒ์ผ ์œ„์น˜๋ฅผ ์„ค์ •ํ•œ๋‹ค. -->
                        <src>${project.basedir}/src/main/resources/deb/systemd/my-app.service</src>
                        <type>file</type>
                        <mapper>
                            <type>perm</type>
                            <prefix>/lib/systemd/system</prefix>
                        </mapper>
                    </data>
                    <data>
                        <src>${project.build.directory}/${project.build.finalName}.jar</src>
                        <type>file</type>
                        <mapper>
                            <type>perm</type>
                            <prefix>/opt/myapp</prefix>
                        </mapper>
                    </data>
                </dataSet>
            </configuration>
        </execution>
    </executions>
</plugin>
XML

packaing ํ•˜๊ธฐ

$> ./mvnw clean package
Bash

package๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด target ๋””๋ ‰ํ† ๋ฆฌ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

  • spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb
  • spring-boot-jdeb.jar

spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb ํŒŒ์ผ์ด ๋ฐ”๋กœ deb ํŒจํ‚ค์ง€ ํŒŒ์ผ์ด๋‹ค. ํ•ด๋‹น ํŒจํ‚ค์ง€ ํŒŒ์ผ ๋‚ด์šฉ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

ubuntu@ubuntu-jammy:~$ dpkg -c spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb
drwxr-xr-x root/root         0 2025-12-08 22:13 ./lib/
drwxr-xr-x root/root         0 2025-12-08 22:13 ./lib/systemd/
drwxr-xr-x root/root         0 2025-12-08 22:13 ./lib/systemd/system/
-rw-r--r-- root/root       257 2025-12-08 22:13 ./lib/systemd/system/my-app.service
drwxr-xr-x root/root         0 2025-12-08 22:13 ./opt/
drwxr-xr-x root/root         0 2025-12-08 22:13 ./opt/myapp/
-rw-r--r-- root/root  20840680 2025-12-08 22:13 ./opt/myapp/spring-boot-jdeb.jar
Bash

deb ํŒŒ์ผ์„ ์„ค์น˜ํ•˜๋ฉด my-app.service๋Š” /lib/systemd/system์— ์„ค์น˜๋˜๊ณ  spring-boot-jdeb.jar๋Š” /opt/myapp์— ์„ค์น˜๋œ๋‹ค.

์„ค์น˜ํ•ด๋ณด๊ธฐ

๋จผ์ € ํŒจํ‚ค์ง€ ์ •๋ณด๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

ubuntu@ubuntu-jammy:~$ dpkg --info spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb
 new Debian package, version 2.0.
 size 21000796 bytes: control archive=1006 bytes.
     233 bytes,     9 lines      control
     133 bytes,     2 lines      md5sums
     664 bytes,    25 lines   *  postinst             #!/bin/sh
     341 bytes,    14 lines   *  prerm                #!/bin/sh
 Package: deb-test-app
 Version: 1.0.0
 Section: misc
 Priority: optional
 Architecture: all
 Installed-Size: 22716
 Maintainer: My Name <my.email@example.com>
 Description: This is my Spring Boot Application package
  distribution via jdeb.
Bash

์•ž์—์„œ ์ •์˜ํ•œ control, postinst, prerm ํŒŒ์ผ์ด ํฌํ•จ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
dataSet์— ์ •์˜ํ•œ ํŒŒ์ผ์€ ๋ฐฐํฌ ๋Œ€์ƒ ํŒŒ์ผ์ด๋ฏ€๋กœ ๋ฉ”ํƒ€ ์ •๋ณด(–info)์—๋Š” ํฌํ•จ๋˜์ง€ ์•Š๋Š”๋‹ค.

์ด์ œ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ ํ•ด๋ณด์ž.

ubuntu@ubuntu-jammy:~$ sudo dpkg -i spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb
Selecting previously unselected package deb-test-app.
(Reading database ... 66578 files and directories currently installed.)
Preparing to unpack spring-boot-jdeb_0.0.1~SNAPSHOT_all.deb ...
Unpacking deb-test-app (1.0.0) ...
Setting up deb-test-app (1.0.0) ...
Systemd ์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ์žฌ์‹œ์ž‘ ์ค‘...
Created symlink /etc/systemd/system/multi-user.target.wants/my-app.service โ†’ /lib/systemd/system/my-app.service.
Bash

๋งˆ์ง€๋ง‰ ‘์„œ๋น„์Šค ๋“ฑ๋ก ๋ฐ ์žฌ์‹œ์ž‘ ์ค‘…’ ๋ฉ”์‹œ์ง€๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ๋กœ ๋ด์„œ ์šฐ๋ฆฌ๊ฐ€ ์ •์˜ํ•œ postinst ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

my-app ์ด๋ฆ„์œผ๋กœ systemd ์„œ๋น„์Šค ๋“ฑ๋ก์ด ์ž˜ ๋˜์—ˆ๋Š”์ง€ ํ™•์ธ ํ•ด ๋ณด์ž.

ubuntu@ubuntu-jammy:~$ systemctl status my-app
โ— my-app.service - My Spring Boot Application
     Loaded: loaded (/lib/systemd/system/my-app.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2025-12-08 23:06:31 KST; 11s ago
   Main PID: 2536 (java)
      Tasks: 30 (limit: 1066)
     Memory: 101.8M
        CPU: 2.461s
     CGroup: /system.slice/my-app.service
             โ””โ”€2536 /usr/bin/java -jar /opt/myapp/spring-boot-jdeb.jar
Bash

dep ํŒจํ‚ค์ง€ ์ด๋ฆ„์€ control ํŒŒ์ผ์˜ package ํ•„๋“œ์— ์ •์˜ํ•œ ๋‚ด์šฉ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ‘deb-test-app’ ์œผ๋กœ ์ •์˜ ํ–ˆ์œผ๋ฏ€๋กœ ์„ค์น˜ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ด ๋ณด์ž.

ubuntu@ubuntu-jammy:/opt/myapp$ dpkg -l | grep deb-test-app
ii  deb-test-app    1.0.0       all          This is my Spring Boot Application package
Bash

control ํŒŒ์ผ์— ์ •์˜ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๊ฐ€ ์ถœ๋ ฅ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

jdeb – Gradle

control, postinst, prerm, my-app.service ๋Š” maven ๊ณผ ๋™์ผํ•œ ๊ฒฝ๋กœ์— ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.
gradle์—์„œ jdeb ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

plugins {
    ...
    // bootJar ํƒœ์Šคํฌ
    id 'org.springframework.boot' version '3.5.7'
    id 'io.spring.dependency-management' version '1.1.7'
    ...
}

configurations{ jdeb }
dependencies { jdeb 'org.vafer:jdeb:1.14' }

task buildDeb {
    group = 'distributions'
    description = 'Creates a Debian package using jdeb'

    dependsOn 'bootJar'

    doLast {
        // 1. jdeb ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋กœ๋“œ
        ant.taskdef(name: 'deb', classname: 'org.vafer.jdeb.ant.DebAntTask', classpath: configurations.jdeb.asPath)

        // 2. bootJar๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ ๊ฐ€์ ธ์˜ค๊ธฐ
        def jarFile = tasks.bootJar.archiveFile.get().asFile

        // 3. deb ํŒจํ‚ค์ง€ ์ƒ์„ฑ ์‹œ์ž‘
        ant.deb(destfile: "${buildDir}/distributions/spring-boot-jdeb.deb", control: "src/main/resources/deb/control") {
            // jar ํŒŒ์ผ ๋ฐฐ๋กœ ์„ค์ •
            data(src: jarFile, type: "file") {
                mapper(type: "perm", prefix: "/opt/myapp")
            }

            // systemd ์„œ๋น„์Šค ํŒŒ์ผ ๋ฐฐํฌ ์„ค์ •
            data(src: file("src/main/resources/deb/systemd/my-app.service"), type: "file") {
                mapper(type: "perm", prefix: "/lib/systemd/system", user: "root", group: "root", filemode: "644")
            }
        }
    }
}
Groovy

distributions > buildDeb ํƒœ์Šคํฌ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. gradle์˜ ๊ฒฝ์šฐ์—๋Š” maven๊ณผ ๋‹ฌ๋ฆฌ bootJar ํƒœ์Šคํฌ๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ fat jar๊ฐ€ ํ•„์š”ํ•˜๋‹ค.(dependsOn ‘bootJar’)

IntelliJ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์šฐ์ธก Gradle ๋ฉ”๋‰ด > Tasks > distributions > buildDeb ๋ฅผ ์‹คํ–‰ ํ•œ๋‹ค.
CLI ๋ช…๋ น์€ ์•„๋ž˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•œ๋‹ค.

$> ./gradlew clean buildDeb
Bash

๊ฒฐ๊ณผ๋Š” build/distributions์— deb ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.


Java ๊ฐœ๋ฐœ์ด ์ฃผ๋กœ ์ปจํ…Œ์ด๋„ˆ(Docker) ํ™˜๊ฒฝ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ์ถ”์„ธ์ง€๋งŒ, ์˜จํ”„๋ ˆ๋ฏธ์Šค ํ™˜๊ฒฝ์— ์ง์ ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์€ ์—ฌ์ „ํžˆ ๋งŽ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ์ด ๋•Œ jdeb๋Š” JAR ํŒŒ์ผ์„ ๋ฆฌ๋ˆ…์Šค ํŒจํ‚ค์ง€ ๋ฐฐํฌ์˜ ํ‘œ์ค€์ธ deb ํ˜•ํƒœ๋กœ ์ž๋™ ๋ณ€ํ™˜ํ•˜์—ฌ ์ˆ˜๋™ ๋ฐฐํฌ ๋ฐ ์Šคํฌ๋ฆฝํŠธ ๊ด€๋ฆฌ์˜ ๋ถ€๋‹ด์„ ์ค„์—ฌ ์ค„ ๊ฒƒ์ด๋ผ๊ณ  ๊ธฐ๋Œ€ํ•œ๋‹ค.
๋ฐฐํฌ์˜ ์•ˆ์ •์„ฑ๊ณผ ์ƒ์‚ฐ์„ฑ์„ ๋™์‹œ์— ์žก๊ณ  ์‹ถ๋‹ค๋ฉด ‘jdeb’ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ Maven, Ant, Gradle ๋นŒ๋“œ ํ”„๋กœ์„ธ์Šค์— ๋„์ž…ํ•ด ๋ณด๋Š” ๊ฒƒ์„ ๊ฐ•๋ ฅ๋„ํ•˜๊ฒŒ ์ถ”์ฒœํ•œ๋‹ค.

์ฐธ๊ณ  ์‚ฌ์ดํŠธ

https://www.baeldung.com/java-debian-deb-packages-jdeb