Jak przekazać opcje JVM z bootRun


99

Tworzę prostą aplikację internetową Spring, która komunikuje się ze zdalnym hostem i chciałbym przetestować ją lokalnie za korporacyjnym proxy. Używam wtyczki Gradle "Spring Boot" i pytanie brzmi: jak mogę określić ustawienia proxy dla JVM?

Wypróbowałem kilka sposobów, aby to zrobić:

  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"

Ale wygląda na to, że żaden z nich nie działa - „NoRouteToHostException” wrzuca kod „sieciowy”. Dodałem również dodatkowy kod do debugowania argumentów startowych JVM:

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

Został wydrukowany tylko jeden argument: „-Dfile.encoding = UTF-8”.

Jeśli ustawię właściwość systemu w kodzie:

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

Wszystko działa dobrze!

Odpowiedzi:


107

Oryginalna odpowiedź (przy użyciu Gradle 1.12 i Spring Boot 1.0.x):

bootRunZadaniem Gradle wtyczki Wiosna Boot rozszerza Gradle zadanie JavaExec. Zobacz to .

Oznacza to, że możesz skonfigurować wtyczkę do korzystania z serwera proxy, dodając:

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

do pliku kompilacji.

Oczywiście możesz użyć systemPropertieszamiastjvmArgs

Jeśli chcesz warunkowo dodać jvmArgs z wiersza poleceń, możesz wykonać następujące czynności:

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

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

Zaktualizowana odpowiedź:

Po wypróbowaniu mojego rozwiązania powyżej przy użyciu Spring Boot 1.2.6.RELEASE i Gradle 2.7 zauważyłem, że nie działa, o czym wspominają niektóre komentarze. Można jednak wprowadzić kilka drobnych poprawek, aby przywrócić stan roboczy.

Nowy kod to:

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

dla argumentów zakodowanych na stałe i

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

    }
}

dla argumentów dostarczonych z wiersza poleceń


4
Nie chciałbym, aby te opcje były „zakodowane na stałe” w pliku kompilacji. Byłoby wspaniale mieć możliwość określenia ustawień proxy. Tj. - używając argumentów wiersza poleceń.
Evgeny

Nie działa: "> Nie można znaleźć właściwości 'args' w projekcie głównym".
Evgeny

Czy poprawnie skopiowałeś kod? Dokonałem aktualizacji. Nie ma argsnieruchomości.
geoand

7
Próbowałem dzisiaj i jedynym sposobem, w jaki to działa, jest umieszczanie listy ciągów w nawiasach kwadratowych, na przykład bootRun {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dhttp.proxyPort = xxxxxx"]}
Valentino Dell ' Aica

Jakiej wersji Gradle używasz?
geoand

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

Powinno to przekazać wszystkie opcje JVM do aplikacji uruchomionej za pośrednictwem bootRun.


2
To zdecydowanie najlepszy sposób na przekazanie opcji wiersza poleceń do maszyny wirtualnej JVM
anubhava

@Marvin Frommhold, dziękuję za odpowiedź. Podejście jest niezwykle proste. W przypadku noobów takich jak ja byłoby pomocne, gdybyś dodał trochę więcej szczegółów. Sugestie: (1) pokaż wywołanie wiersza poleceń gradle z argumentami; (2) pokaż, jak odwoływać się do argumentów w Spring Boot, np. @Value ("$ {property: default}"); (3) Pomocny byłby również zrzut ekranu okna dialogowego IntelliJ przekazującego parametry.
Brett

1
Niestety, dla mnie samo dodanie tego powoduje, że Gradle bootRun kończy się niepowodzeniem z "org.apache.catalina.Lifecycle. Wyjątek: Kontener podrzędny nie powiódł się podczas startu", nawet jeśli nie przekazuje żadnych parametrów -D
tkruse

Rozwiązany przez wybranie najlepszych nieruchomości, które chcę, jak w odpowiedzi na stackoverflow.com/questions/23689054
tkruse.

7

W skrypcie kompilacji Gradle zdefiniuj właściwości systemowe dla zadania uruchamiania.

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

i gradle runpowinien zaakceptować tę wartość.

Lub zdefiniuj właściwość na poziomie projektu, jak wspomniano w http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run


1
Tak, to rozwiązanie działa. Ale nie chciałbym mieć tego kodu pod kontrolą źródła. Uważam, że „najbardziej właściwym” rozwiązaniem jest przekazanie tych opcji bezpośrednio w linii poleceń. Czy to jakikolwiek sposób?
Evgeny

1
Link wspomniany w poście ma sposób na przekazanie ich z linii poleceń
suman j

5

@marvin, dzięki za twój post, był bardzo pomocny.

Udostępnianie, jak go użyłem:

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

Mam testy JUnit, które chciałem pominąć, chyba że użyto właściwości do uwzględnienia takich testów. Korzystanie z JUnit Załóżmy, że warunkowe dołączanie testów:

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

Wykonanie tego z gradle wymagało, aby właściwość systemowa dostarczona w czasie uruchamiania kompilacji gradle, pokazana tutaj,

gradle build -Ddeep.test.run=true

rzeczywiście został poddany testom.

Mam nadzieję, że pomoże to innym wypróbować to podejście do warunkowego uruchamiania testów.


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

Używanie jvmArgs może powodować problemy z uruchamianiem maszyny JVM. Używanie argumentów umożliwia przekazywanie niestandardowych argumentów programu


Czy możesz mi pokazać, jak używać tych argumentów w Application.class lub Bootstrap.class? (Używam Grails 3.xx)
Stefano Scarpanti

2

Wydaje się, że działa:

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

1

Wpadłem w podobny problem, bootRun potrzebował pewnych parametrów, ale nie chciałbym modyfikować bootRun, ponieważ chcę zachować pewną elastyczność i trzymać się standardowego zachowania bootRun. Moją sugestią jest dodanie niestandardowych zadań (powiedzmy bootRunDev, bootRunProxy), które rozszerzają bootRun, jak opisano w poniższym fragmencie kodu

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

Nie mam środowiska do ćwiczenia skryptu, ale użyłem tego podejścia, aby przekazać profil do sprężyny za pomocą właściwości spring.profiles.active. Kredyty powinny trafić do Karola Kalińskiego

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.