前回、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 を利用する場合には、いくつか方法がありますが、起動時に設定が可能なシステムプロパティか環境変数がいいのかなーと思いました。
プロパティファイルやマニフェストファイルの場合、コードにパスがべた書きされてしまうので、環境ごとに設定が違うとかだとやりづらい気がします。
もしくは、プロパティファイルを環境ごとに作成して、起動時にシステムプロパティでプロパティファイル名を指定するとかですかね。