magのOSS備忘録

使ったOSSソフトウェアについて書いていきます。

Spring Bootアプリケーションの実行時にJava VMにVM引数を渡す方法

概要

Spring Boot Maven PluginでSpring Bootアプリケーションを起動する際に、Java VMVM引数を渡す方法を記載する。

動機

Spring Bootを使った開発では、通常EclipseIntelliJ IDEAなどのIDEを使うことが多い。筆者はEclipseを使うことが多いが、Eclipseは想定しないタイミングで重くなることが多く、急ぎで動作確認したいときなどはコマンドラインでSpring Bootを起動したいことがある。開発環境でのアプリ起動はSpring Boot Maven Pluginを使っている。

そして、職場の開発環境ではフォーワードプロキシがあるネットワークを使うため、外部ネットワークのサーバーと通信したいときはこのプロキシを通過できるよう構成する必要がある。

Spring FrameworkのRestTemplateクラスはVM引数でプロキシを指定できるが、Spring Boot Maven Pluginでアプリを起動するときは、プラグインに引数をバイパスしてもらう必要があったが、なかなか設定方法にたどり着けなかったので書き残すことにした。

実行環境・前提条件

目次

指定方法

公式ドキュメントのチュートリアルに記載されているように、Spring Bootアプリケーションの実行は以下のように行う。

mvn.cmd spring-boot:run

Spring Bootアプリケーションを実行しているJava VMVM引数を渡すには、Spring Boot Maven Pluginのオプションに指定する。以下の公式ドキュメントに記載があったが、なかなか気が付かなかった。

Spring Boot Maven プラグインのドキュメント - リファレンス

以下が実際に指定する方法。spring-boot.run.jvmArgumentsを使ってプラグインVM引数をバイパスしてもらう。 ここではプロキシ設定を例として渡している。

mvn.cmd spring-boot:run -Dspring-boot.run.jvmArguments="-Dhttp.proxyHost=aaa -Dhttp.proxyPort=bbb -Dhttp.proxyUser=ccc -Dhttp.proxyPassword=ddd -Dhttps.proxyHost=aaa -Dhttps.proxyPort=bbb -Dhttps.proxyUser=ccc -Dhttps.proxyPassword=ddd"

なお、以下のようにpom.xmlに記載する方法もある。公式ドキュメントからの引用である。 今回のユーザー名やパスワードが含まれるケースは、コマンドライン引数で指定するほうが望ましいだろう。

<project>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                        -Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005
                    </jvmArguments>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Eclipse STSを使う場合

EclipseSTSプラグインをインストールして使用している場合は、実行プロファイルでVM引数を指定することができる。 spring-boot.run.jvmArgumentsに渡すパラメータをそのまま実行プロファイルに指定すればよい。

参考