Frage Wie man JVM-Optionen von bootRun übergibt


Ich entwickle einfache Spring Web-Anwendung, die mit Remote-Host kommuniziert und ich möchte es lokal hinter Corporate Proxy testen. Ich benutze "Spring Boot" Gradle Plugin und die Frage ist Wie kann ich Proxy-Einstellungen für JVM angeben?

Ich habe es auf verschiedene Arten versucht:

  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"

Aber es scheint, als ob keiner von ihnen funktioniert - "NoRouteToHostException" wirft "Netzwerk" -Code ein. Außerdem habe ich zusätzlichen Code hinzugefügt, um JVM-Startargumente zu debuggen:

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

Und nur ein Argument wurde gedruckt: "-Dfile.encoding = UTF-8".

Wenn ich die Systemeigenschaft im Code festlege:

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

Alles funktioniert gut!


75
2017-08-01 11:27


Ursprung


Antworten:


Ursprüngliche Antwort (mit Gradle 1.12 und Spring Boot 1.0.x):

Das bootRun Aufgabe des Spring Boot-Gradle-Plugins erweitert die JavaExec-Task von gradelle. Sehen Dies.

Das bedeutet, dass Sie das Plugin so konfigurieren können, dass es den Proxy verwendet, indem Sie Folgendes hinzufügen:

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

zu Ihrer Build-Datei.

Natürlich könntest du das benutzen systemProperties Anstatt von jvmArgs

Wenn Sie jvmArgs über die Befehlszeile bedingt hinzufügen möchten, können Sie Folgendes tun:

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

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

Aktualisierte Antwort:

Nach dem Ausprobieren meiner obigen Lösung Spring Boot 1.2.6 und Gradel 2.7 Ich bemerkte, dass es nicht funktionierte, wie einige der Kommentare erwähnen. Es können jedoch einige kleinere Verbesserungen vorgenommen werden, um den Arbeitszustand wiederherzustellen.

Der neue Code lautet:

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

für hart codierte Argumente und

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

    }
}

für Argumente, die von der Befehlszeile bereitgestellt werden


82
2017-08-01 11:39



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

Dies sollte alle JVM-Optionen an die App übergeben, die über gestartet wurde bootRun.


52
2017-10-01 12:52



Definieren Sie in Gradle-Build-Skript systemProperties für die Ausführung der Aufgabe.

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

und gradle run sollte diesen Wert akzeptieren.

Oder definieren Sie eine Eigenschaft auf Projektebene wie in http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run


4
2017-08-01 11:32



@marvin, danke für deinen Beitrag es war sehr hilfreich.

Teilen wie ich es benutzt habe:

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

Ich habe JUnit-Tests, die ich überspringen wollte, es sei denn, eine Eigenschaft wurde verwendet, um solche Tests einzubeziehen. Verwenden von JUnit Gehen Sie folgendermaßen vor, um die Tests bedingt einzubeziehen:

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

Dies mit Gradle zu tun, erfordert, dass die Systemeigenschaft, die zum Zeitpunkt der Ausführung von Gradle zur Verfügung gestellt wurde, hier gezeigt wird.

gradle build -Ddeep.test.run=true

wurde tatsächlich zu den Tests durchgeführt.

Ich hoffe, dies hilft anderen, diesen Ansatz zu testen, um Tests bedingt durchzuführen.


3
2017-11-28 05:14



Es scheint zu funktionieren:

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

1
2017-09-11 15:27



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

Die Verwendung von jvmArgs kann zu JVM-Startproblemen führen. Mit Argumenten können Sie Ihre benutzerdefinierten Programmargumente übergeben


1
2017-08-05 15:28



Ich bin auf ein ähnliches Problem gestoßen, BootRun benötigte einige Parameter, aber ich würde nicht das Gefühl haben, BootRun zu modifizieren, da ich etwas Flexibilität beibehalten und das Standard-BootRun-Verhalten beibehalten möchte. Mein Vorschlag ist, einige benutzerdefinierte Aufgaben hinzuzufügen (sagen wir bootRunDev, bootRunProxy), die bootRun erweitern, wie im folgenden Code-Snippet beschrieben

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'
    }
}

Ich habe keine Umgebung, um das Skript auszuprobieren, aber ich habe diesen Ansatz verwendet, um das Profil mit der Eigenschaft spring.profiles.active an den Frühling zu übergeben. Credits sollten gehen zu Karol Kalinski


0
2018-05-03 08:20