So übergeben Sie JVM-Optionen von bootRun

98

Ich entwickle eine einfache Spring-Webanwendung, die mit dem Remote-Host kommuniziert, und möchte sie lokal hinter dem Unternehmens-Proxy testen. Ich verwende das Gradle-Plugin "Spring Boot" und die Frage ist, wie ich Proxy-Einstellungen für JVM festlegen kann.

Ich habe verschiedene Möglichkeiten ausprobiert:

  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 zum Debuggen von JVM-Startargumenten hinzugefügt:

    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!

Evgeny
quelle

Antworten:

106

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

Die bootRunAufgabe des Spring Boot Gradle Plugins erweitert die Gradle JavaExec Aufgabe. Sehen Sie das .

Das bedeutet, dass Sie das Plugin für die Verwendung des Proxys konfigurieren können, indem Sie Folgendes hinzufügen:

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

zu Ihrer Build-Datei.

Natürlich können Sie das systemPropertiesanstelle von verwendenjvmArgs

Wenn Sie jvmArgs über die Befehlszeile bedingt hinzufügen möchten, haben Sie folgende Möglichkeiten:

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

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

Aktualisierte Antwort:

Nachdem ich meine obige Lösung mit Spring Boot 1.2.6.RELEASE und Gradle 2.7 ausprobiert hatte, stellte ich fest, dass sie nicht funktionierte, wie in einigen Kommentaren erwähnt. Es können jedoch einige geringfügige Änderungen vorgenommen werden, um den Arbeitszustand wiederherzustellen.

Der neue Code lautet:

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

für fest codierte Argumente und

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

    }
}

für Argumente, die über die Befehlszeile bereitgestellt werden

geoand
quelle
4
Ich möchte diese Optionen nicht "fest codiert" in der Build-Datei haben. Es wäre großartig, die Möglichkeit zu haben, Proxy-Einstellungen festzulegen. Dh - Verwenden von Befehlszeilenargumenten.
Evgeny
Funktioniert nicht: "> Die Eigenschaft 'args' im Root-Projekt konnte nicht gefunden werden".
Evgeny
Haben Sie den Code korrekt kopiert? Ich habe ein Update gemacht. Es gibt kein argsEigentum.
Geo und
7
Ich habe es heute versucht und die einzige Möglichkeit, dies zu tun, besteht darin, die Liste der Zeichenfolgen in eckige Klammern zu setzen, z. B. bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell ' Aica
Welche Version von Gradle verwenden Sie?
Geo und
71
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

Dadurch sollten alle JVM-Optionen an die App übergeben werden, die über gestartet wurde bootRun.

Marvin Frommhold
quelle
2
Dies ist bei weitem der beste Weg, um Befehlszeilenoptionen an JVM zu übergeben
anubhava
@ Marvin Frommhold, danke für deine Antwort. Der Ansatz ist unglaublich einfach. Für Noobs wie mich wäre es hilfreich, wenn Sie etwas mehr Details hinzufügen würden. Vorschläge: (1) Zeigen Sie den Gradle-Befehlszeilenaufruf mit den Argumenten an. (2) zeigen, wie auf die Argumente in Spring Boot verwiesen wird, z. B. @Value ("$ {property: default}"); (3) Ein Screenshot des IntelliJ-Dialogfelds, in dem die Parameter übergeben werden, wäre ebenfalls hilfreich.
Brett
1
Leider führt das Hinzufügen von gradle bootRun mit "org.apache.catalina.LifecycleException: Ein untergeordneter Container ist beim Start fehlgeschlagen" schrecklich fehl, selbst wenn keine -D-Parameter übergeben wurden
tkruse
Gelöst durch Auswahl der Eigenschaften, die ich möchte, wie in einer Antwort auf stackoverflow.com/questions/23689054
tkruse
7

Definieren Sie im Gradle-Build-Skript systemProperties für die Ausführungsaufgabe.

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

und gradle runsollte diesen Wert akzeptieren.

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

suman j
quelle
1
Ja, diese Lösung funktioniert. Aber ich möchte diesen Code nicht unter Quellcodeverwaltung haben. Ich glaube, dass die "richtigste" Lösung darin besteht, diese Optionen direkt in der Befehlszeile zu übergeben. Ist es ein Weg dafür?
Evgeny
1
Der in der Post erwähnte Link hat eine Möglichkeit, sie von der Kommandozeile zu übergeben
suman j
5

@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 einzuschließen. Verwenden von JUnit Nehmen Sie an, dass Sie die Tests unter bestimmten Bedingungen einschließen:

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

Um dies mit gradle zu tun, muss die hier gezeigte Systemeigenschaft zum Zeitpunkt der Ausführung von gradle build vorhanden sein.

gradle build -Ddeep.test.run=true

wurde in der Tat zu den Tests durchgereicht.

Ich hoffe, dies hilft anderen, diesen Ansatz für die bedingte Ausführung von Tests auszuprobieren.

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

Die Verwendung von jvmArgs kann zu Problemen beim Start von JVM führen. Mit args können Sie Ihre benutzerdefinierten Programmargumente übergeben

Cristian Botiza
quelle
Können Sie mir zeigen, wie diese Argumente in Application.class oder in Bootstrap.class verwendet werden? (Ich benutze Grails 3.xx)
Stefano Scarpanti
2

Es scheint zu funktionieren:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}
Levsa
quelle
1

Ich hatte ein ähnliches Problem: bootRun benötigte einige Parameter, aber ich würde keine Lust haben, bootRun zu ändern, da ich etwas Flexibilität behalten und mich an das Standardverhalten von bootRun halten möchte. Mein Vorschlag ist, einige benutzerdefinierte Aufgaben (z. B. bootRunDev, bootRunProxy) hinzuzufügen, die bootRun erweitern, wie im folgenden Codeausschnitt 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 auszuführen, aber ich habe diesen Ansatz verwendet, um das Profil mit der Eigenschaft spring.profiles.active an spring zu übergeben. Credits sollten an Karol Kaliński gehen

Evelino Bomitali
quelle