Spring bootアプリで読み込むプロパティファイルを外出ししたい。

開発バージョン:
Spring boot version 2.1.1.RELEASE
Maven 3.6

Spring boot実行jarの中にプロパティファイルを含めるのではなく、外部ディレクトリに配置したい。

複数台のLinuxサーバに同じアプリをデプロイしてもLinuxサーバに置かれているプロパティファイルの中身次第でDBの接続設定とか挙動が変わるようにしたいって要件はよくありますね。
それです。

まず今回のSpring bootアプリケーションの実行方法は以下コマンド形式で行うことを想定してる。
java -jar MyApplication.jar

実行時のクラスパスを指定する方法はいろいろあるが
今回はここに、-Dloader.path=[ディレクトリパス]を加えて以下のように実行する事とする。
java -jar -Dloader.path=./conf MyApplication.jar
※この例ではカレントディレクトリのconfディレクトリをSpring boot実行時のクラスパスに追加する。そのconfディレクトリの下に後述する3つのプロパティファイルを配置する。

今回はMavenを使ってデプロイ資材のかためを行う。
悪いけどGradleとかでやる方は各自で適宜読み替えてほしい・・・。

またプロパティファイルは個人的趣向で複数としている。

  • application.properties ・・・Spring bootアプリケーション設定
  • database.properties ・・・DB接続設定はこっち
  • logger.properties ・・・ログ出力設定はこっち

上記複数のプロパティファイルを読み込むためBootアプリケーションのクラスソースは以下のような記述となる。

@SpringBootApplication
@PropertySources({
    @PropertySource("classpath:application.properties"),
    @PropertySource("classpath:database.properties"),
    @PropertySource("classpath:logger.properties")
})
public class StartBatchApplication {
	public static void main(String[] args) {
...

file指定ではなくclasspath指定である事がより配置の柔軟性を持たせている事に注意されたい。

通常Spring bootアプリケーションのapplication.propertisやapplication.ymlといったプロパティファイルは
src/main/resourcesなどのパッケージ上に配置して開発し、
パッケージング時にJar内のクラスパス配下に同梱され後で書き換えることはできない。
※中身を書き換えたJarを実行しようとするとSpring bootの整合性チェックライブラリによる例外が発生するはず。

デプロイ用のパッケージングについてはMavenで以下のコマンドを実行する。
mvn clean package

横道に逸れるが、Mavenの記載をする際にフェーズは重要だ。プラグインの実行タイミングを指定する際は実行フェーズを意識しないといけない。
フェーズについては以下のURLがとても参考になる。著者に感謝。

Spring boot資材を固める場合、spring-boot-maven-pluginが使われるよう注意する。
コマンドの実行結果を注意深くみてmvnコマンド実行時にmaven-jar-pluginが実行されるようならば
spring-boot-maven-pluginに対してexecution設定を加えてみる。

上記の準備が整ったところで
デプロイ資材として固める際のプロパティファイル除去を行う。
Mavenのプラグインに以下を追加。

これにより、最終結果のJarにはpropertiesプロパティファイルが除去され固められる。
※yamlやxmlをプロパティファイルにしている場合は適宜置き換えてほしい。

これで設定は終わりではなく重要な指定がある。
起動時に外部プロパティファイルを読み込ませるため
Spring bootの起動設定をPropertiesLauncherにしてやる必要がある。

layoutにZIPまたはDIRを指定してやる。
できあがったJarをZip展開し、MANIFEST.MFを確認してみると
Main-Class: org.springframework.boot.loader.PropertiesLauncher
という記載になっているはずだ。

以上でpom.xmlの設定ポイントは終了。
ここまでいけば、
mvn clean package
で出来上がった資材と同じ場所にconfフォルダを作り、その下にプロパティファイルを配置。
javaコマンド実行することで外部プロパティファイルの内容が反映されプログラムが実行されるようになったはず。
java -Dloader.path=./conf -jar MyApplication.jar

デプロイ作業地獄から一歩前進。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です