Spring Bootアプリケーションをassemblyプラグインでtarアーカイブにパッケージング

概要

Mavenのmaven-assembly-pluginを使用して、Spring Bootアプリケーションをtar.gz形式でビルドする方法について説明します。この手法により、実行可能JARと設定ファイル、スクリプトを含む一貫したディレクトリ構造の配布用アーカイブを作成できます。

pom.xmlへのプラグイン設定

まず、pom.xmlmaven-assembly-pluginを追加します。以下の設定を<build>セクション内に記述します。

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <excludes>
        <exclude>**/*.properties</exclude>
        <exclude>**/*.yml</exclude>
      </excludes>
    </resource>
  </resources>

  <plugins>
    <!-- アセンブリプラグイン -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-assembly-plugin</artifactId>
      <version>3.6.0</version>
      <configuration>
        <finalName>${project.artifactId}</finalName>
        <appendAssemblyId>false</appendAssemblyId>
        <tarLongFileMode>gnu</tarLongFileMode>
        <outputDirectory>${project.build.directory}/dist</outputDirectory>
        <descriptors>
          <descriptor>src/main/assembly/package-assembly.xml</descriptor>
        </descriptors>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>single</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

注意点: Spring Bootのデフォルトのspring-boot-maven-pluginは、executable JARを作成するため、これを削除または無効化しないと、二重パッケージングや起動クラスの競合が発生します。

アセンブリ定義ファイルの作成

src/main/assembly/package-assembly.xmlを作成し、出力アーカイブの構成を定義します。

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.2"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.2 http://maven.apache.org/xsd/assembly-2.2.xsd">

  <id>release</id>
  <baseDirectory>${project.artifactId}-distribution</baseDirectory>
  <includeBaseDirectory>true</includeBaseDirectory>

  <formats>
    <format>tar.gz</format>
  </formats>

  <fileSets>
    <!-- 設定ファイルをconfディレクトリに出力 -->
    <fileSet>
      <directory>src/main/resources</directory>
      <outputDirectory>conf</outputDirectory>
      <includes>
        <include>*.properties</include>
        <include>*.yml</include>
      </includes>
      <filtered>true</filtered>
    </fileSet>

    <!-- 実行スクリプトをbinディレクトリに配置 -->
    <fileSet>
      <directory>src/main/assembly/scripts</directory>
      <outputDirectory>bin</outputDirectory>
      <includes>
        <include>*.sh</include>
      </includes>
      <fileMode>0755</fileMode>
    </fileSet>

    <!-- ライセンスやドキュメントをdocsに配置 -->
    <fileSet>
      <directory>src/main/docs</directory>
      <outputDirectory>docs</outputDirectory>
    </fileSet>
  </fileSets>

  <dependencySets>
    <!-- 実行時依存ライブラリをlibに格納 -->
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <scope>runtime</scope>
      <unpack>false</unpack>
    </dependencySet>
  </dependencySets>
</assembly>

スクリプトファイルの準備

src/main/assembly/scriptsディレクトリを作成し、起動・停止スクリプトを配置します。例としてstart-app.sh

#!/bin/bash
APP_NAME="my-springboot-app"
JAR_FILE="lib/${APP_NAME}.jar"
LOG_DIR="logs"
LOG_FILE="${LOG_DIR}/app.log"

mkdir -p $LOG_DIR

java -Dspring.config.location=./conf/ \
     -jar $JAR_FILE \
     > $LOG_FILE 2>&1 &

echo "Application started. Log: $LOG_FILE"

ビルドの実行

以下のコマンドでパッケージングを実行します。

mvn clean package

成功すると、target/distディレクトリに次のような構造の.tar.gzファイルが生成されます。

my-springboot-app-distribution/
├── bin/
│   └── start-app.sh
├── conf/
│   ├── application.yml
│   └── logback-spring.xml
├── lib/
│   ├── my-springboot-app.jar
│   └── *.jar (外部ライブラリ)
└── docs/
    └── README.md

タグ: Maven spring-boot assembly-plugin tar gzip

8月30日 17:28 投稿