前回、MessageSource関連を調査しているときに、メッセージを管理しているプロパティファイルを、Spring Boot プロジェクトの外に配置する必要がありました。
SpringのMessageSourceをリロードする
その際、Spring Bootでクラスパスを追加する方法を調べたところ、方法がいくつかあったのでまとめてみようと思います。
起動方法によって設定が違ったり、設定方法がいくつかあったりします。
環境
- Spring Boot 2.0.6.RELEASE
mvn spring-boot:run で起動する場合
Spring Boot Maven Plugin を利用して、アプリケーションを起動する場合です。
以下のいずれかの方法で追加できます。
起動引数で指定する
パスはカンマ区切りで複数指定することができます。
mvn spring-boot:run -Dspring-boot.run.folders=[パス]
pom.xmlに書く
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<folders>
<folder>[パス]</folder>
</folders>
</configuration>
</plugin>
Executable Jar の場合
Executable Jar を作成し、javaコマンドで実行する場合です。
ちなみに以下のようにしてもクラスパスは追加されません。
java -cp [パス] -jar jarFile
javaコマンドは-jarが指定された場合、-cpを無視します。
Mainクラスを変更する
MainクラスとしてPropertiesLauncherを利用すれば、クラスパスを追加することが可能です。
Spring Boot Maven Pluginを利用している場合はlayoutにZIPかDIRを設定することで、PropertiesLauncherを利用することができます。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<layout>ZIP</layout>
</configuration>
</plugin>
続いて、追加するクラスパスに関する設定ですが、いくつかの設定方法があります。
優先順位が高い順に記載していきます。
システムプロパティで指定する
起動時に-Dloader.pathでクラスパスを追加できます。
java -Dloader.path=[パス] -jar jarFile
ちなみに、-jar より後ろに-Dloader.path=[パス]のように実行してうまく行かず、しばらく悩みました。
javaコマンドはjava [-options] -jar jarFile [args...]という順序で指定しないといけません。
環境変数で指定する
環境変数LOADER_PATHに設定します。
起動は普通にjavaコマンドを利用すればOKです。
set LOADER_PATH=[パス]
export LOADER_PATH=[パス]
プロパティファイルで指定する
resources直下にloader.propertiesというファイル名で設定ファイルを配置します。
こちらも起動は普通にjavaコマンドを利用すればOKです。
loader.path=[パス]
なお、ファイル名や配置場所は設定によって変更することもできます。
マニフェストファイルで指定する
マニフェストファイルにLoader-Pathを指定することで、クラスパスを追加できます。
起動は普通にjavaコマンドで。
Maven Jar Plugin を使うなら以下のように設定すればOKです。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifestEntries>
<Loader-Path>[パス]</Loader-Path>
</manifestEntries>
</archive>
</configuration>
</plugin>
まとめ
Executable Jar を利用する場合には、いくつか方法がありますが、起動時に設定が可能なシステムプロパティか環境変数がいいのかなーと思いました。
プロパティファイルやマニフェストファイルの場合、コードにパスがべた書きされてしまうので、環境ごとに設定が違うとかだとやりづらい気がします。
もしくは、プロパティファイルを環境ごとに作成して、起動時にシステムプロパティでプロパティファイル名を指定するとかですかね。