web-dev-qa-db-ja.com

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

リモートホストと通信する簡単な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」という引数が1つだけ出力されました。

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

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

すべてうまくいきます!

85
Evgeny

オリジナルの回答(Gradle 1.12およびSpring Boot 1.0.xを使用):

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

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

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.RELEASEおよびGradle 2.7を使用して上記のソリューションを試した後、一部として動作していないことがわかりましたコメントの言及の。ただし、動作状態を回復するために、いくつかのマイナーな調整を行うことができます。

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

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

ハードコーディングされた引数の場合、および

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

    }
}

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

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

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

62

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 に記載されているようにプロジェクトレベルのプロパティを定義します

6
suman j

@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

実際にテストにパススルーされました。

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

5
Rishik Dhar
bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

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

2
Cristian Botiza

うまくいくようです:

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

同様の問題に直面しました。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 に移動する必要があります

1