11
11

More than 5 years have passed since last update.

Spring Bootでクラスパスを追加する方法

Last updated at Posted at 2018-10-29

前回、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に書く

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を利用している場合はlayoutZIPDIRを設定することで、PropertiesLauncherを利用することができます。

pom.xml
<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です。

windows
set LOADER_PATH=[パス]
linux
export LOADER_PATH=[パス]

プロパティファイルで指定する

resources直下にloader.propertiesというファイル名で設定ファイルを配置します。
こちらも起動は普通にjavaコマンドを利用すればOKです。

loader.properties
loader.path=[パス]

なお、ファイル名や配置場所は設定によって変更することもできます。

マニフェストファイルで指定する

マニフェストファイルにLoader-Pathを指定することで、クラスパスを追加できます。
起動は普通にjavaコマンドで。

Maven Jar Plugin を使うなら以下のように設定すればOKです。

pom.xml
<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 を利用する場合には、いくつか方法がありますが、起動時に設定が可能なシステムプロパティか環境変数がいいのかなーと思いました。

プロパティファイルやマニフェストファイルの場合、コードにパスがべた書きされてしまうので、環境ごとに設定が違うとかだとやりづらい気がします。

もしくは、プロパティファイルを環境ごとに作成して、起動時にシステムプロパティでプロパティファイル名を指定するとかですかね。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11