bootRunからJVMオプションを渡す方法


99

リモートホストと通信する簡単なSpring Webアプリケーションを開発しています。企業のプロキシの背後でローカルにテストしたいと考えています。「Spring Boot」gradleプラグインを使用していますが、JVMのプロキシ設定を指定するにどうすればよいですか。

私はそれを行うためにいくつかの方法を試しました:

  1. gradle -Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080 bootRun
  2. export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
  3. export GRADLE_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"

しかし、それらのどれも機能しないようです-「NoRouteToHostException」は「ネットワーク」コードをスローします。また、JVM開始引数をデバッグするためのコードをいくつか追加しました。

    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    List<String> arguments = runtimeMxBean.getInputArguments();
    for (String arg: arguments) System.out.println(arg);

また、出力された引数は「-Dfile.encoding = UTF-8」のみです。

コードでシステムプロパティを設定した場合:

    System.setProperty("http.proxyHost", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");

すべてうまくいきます!

回答:


106

元の回答(Gradle 1.12とSpring Boot 1.0.xを使用):

bootRunSpring Boot gradleプラグインのタスクは、gradle JavaExecタスクを拡張します。参照してくださいこれを

つまり、以下を追加することで、プロキシを使用するようにプラグインを構成できます。

bootRun {
   jvmArgs = "-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"
}

ビルドファイルに。

もちろん、systemProperties代わりにjvmArgs

コマンドラインから条件付きでjvmArgsを追加する場合は、次の操作を実行できます。

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs project.jvmArgs.split('\\s+')
    }
}

gradle bootRun -PjvmArgs="-Dwhatever1=value1 -Dwhatever2=value2"

更新された回答:

Spring Boot 1.2.6.RELEASEGradle 2.7を使用して上記のソリューションを試した後、コメントの一部が言及しているように機能しないことがわかりました。ただし、作業状態を回復するためにいくつかのマイナーな調整を行うことができます。

新しいコードは次のとおりです。

bootRun {
   jvmArgs = ["-Dhttp.proxyHost=xxxxxx", "-Dhttp.proxyPort=xxxxxx"]
}

ハードコードされた引数、および

bootRun {
    if ( project.hasProperty('jvmArgs') ) {
        jvmArgs = (project.jvmArgs.split("\\s+") as List)

    }
}

コマンドラインから提供された引数


4
ビルドファイルでこのオプションを「ハードコード」しないでください。プロキシ設定を指定できる可能性があると便利です。つまり、コマンドライン引数を使用します。
Evgeny 2014

動作しません: ">ルートプロジェクトでプロパティ「args」が見つかりませんでした。
Evgeny 2014

コードを正しくコピーしましたか?更新しました。argsプロパティはありません。
ジオおよび2014

7
今日、この作業を試みた唯一の方法は、bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx"、 "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell 'の

どのバージョンのGradleを使用していますか?
geoおよび2014年

72
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

これにより、すべてのJVMオプションがを介して開始されたアプリに渡されますbootRun


2
これは、JVMにコマンドラインオプションを渡す最も優れた方法です
anubhava

@Marvin Frommhold、回答ありがとうございます。アプローチは信じられないほど簡単です。私のような初心者の場合、もう少し詳細を追加すると役に立ちます。提案:(1)引数付きのgradleコマンドライン呼び出しを示します。(2)Spring Bootで引数を参照する方法を示します(例:@Value( "$ {property:default}"); (3)パラメータを渡すIntelliJダイアログのスクリーンショットも参考になります。
ブレット

1
任意の-Dのparams渡していない場合でも:悲しいことに、私にとっては、ちょうどこの原因はbootRunは「開始時に失敗した子コンテナorg.apache.catalina.LifecycleException」と恐ろしく失敗するのGradle追加
tkruse


7

Gradleビルドスクリプトで、実行タスクのsystemPropertiesを定義します。

//to provide the properties while running the application using spring-boot's run task
    run {
        systemProperties['property name'] = 'value'
    }

そしてgradle run、この値を受け入れる必要があります。

または、http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_runで説明されているように、プロジェクトレベルのプロパティを定義します。


1
はい、このソリューションは機能します。しかし、私はこのコードをソース管理下に置かないようにしたいと思います。「最も適切な」解決策は、このオプションをコマンドラインで直接渡すことだと思います。それのための方法はありますか?
エフゲニー2014

1
投稿で言及されているリンクには、コマンドラインからそれらを渡す方法があります
suman j

5

@marvin、投稿ありがとうございます。

私がそれをどのように使用したかを共有する:

test {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

プロパティを使用してそのようなテストを含める場合を除いて、スキップしたいJUnitテストがあります。テストを条件付きで含めるためのJUnit Assumeの使用:

//first line of test
assumeThat(Boolean.parseBoolean(System.getProperty("deep.test.run","false"),true)

gradleでこれを行うには、次に示すように、gradleビルドの実行時に提供されるシステムプロパティが必要です。

gradle build -Ddeep.test.run=true

確かにテストに合格しました。

これが、条件付きでテストを実行するためにこのアプローチを試す他の人を助けることを願っています。


3
bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

jvmArgsを使用すると、JVM起動の問題が発生する可能性があります。argsを使用すると、カスタムプログラムの引数を渡すことができます


Application.classまたはBootstrap.classでこれらの引数を使用する方法を教えていただけますか?(私はgrails 3.xxを使用しています)
Stefano Scarpanti 2017

2

それはうまくいくようです:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}

1

同様の問題が発生しました。bootRunにはいくつかのパラメータが必要ですが、ある程度の柔軟性を維持して標準のbootRunの動作に固執したいので、bootRunを変更したくありません。私の提案は、次のコードスニペットで説明されているように、bootRunを拡張するいくつかのカスタムタスク(bootRunDev、bootRunProxyなど)を追加することです。

task bootRunPxy(type: org.springframework.boot.gradle.run.BootRunTask, dependsOn: 'build') {
    group = 'Application'
    doFirst() {
        main = project.mainClassName
        classpath = sourceSets.main.runtimeClasspath
        systemProperty 'http.proxyHost', 'xxxxx'
        systemProperty 'http.proxyPort', 'yyyyy'
    }
}

スクリプトを実行する環境はありませんが、このアプローチを使用して、プロパティspring.profiles.activeを使用してプロファイルをSpringに渡しました。クレジットはKarolKalińskiに移動する必要があります

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.