Jak przekazać opcje JVM z bootruna

Rozwijam prostą aplikację webową Spring, która komunikuje się ze zdalnym hostem i chciałbym przetestować ją lokalnie za corporate proxy. Używam wtyczki gradle" Spring Boot " i pytanie brzmi Jak mogę określić ustawienia proxy dla JVM?

Mam 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 "network". Ponadto dodałem kilka dodatkowych kod do debugowania argumentów startowych JVM:

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

I wydrukowano tylko jeden argument: "- Dfile.encoding = UTF-8".

Jeśli ustawiam właściwość systemową w kodzie:

    System.setProperty("http.proxyHost", "X.X.X.X");
    System.setProperty("http.proxyPort", "8080");
Wszystko działa dobrze!
Author: vaxquis, 2014-08-01

7 answers

Oryginalna odpowiedź (za pomocą Gradle 1.12 i Spring Boot 1.0.x):

bootRun zadanie wtyczki Spring Boot gradle rozszerza zadanie Gradle JavaExec. Zobacz to .

Oznacza to, że możesz skonfigurować wtyczkę tak, aby używała proxy, dodając:

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

Do pliku kompilacji.

Oczywiście możesz użyć systemProperties zamiast jvmArgs

Jeśli chcesz warunkowo dodać jvmArgs z linii poleceń możesz po:

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 za pomocą Spring Boot 1.2.6.RELEASE i Gradle 2.7 zauważyłem, że nie działa, jak wspominają niektóre komentarze. Można jednak wprowadzić kilka drobnych poprawek, aby odzyskać stan pracy.

Nowy kod to:

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

Dla mocno zakodowanych argumentów i

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

    }
}

Dla argumentów podanych z linii poleceń

 82
Author: geoand,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-30 06:04:47
bootRun {
  // support passing -Dsystem.property=value to bootRun task
  systemProperties = System.properties
}

To powinno przekazać wszystkie opcje JVM do aplikacji uruchomionej przez bootRun.

 54
Author: Marvin Frommhold,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-01 12:52:43

W skrypcie gradle build zdefiniuj systemProperties dla run task.

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

I {[1] } powinny przyjąć tę wartość.

Lub zdefiniuj właściwość na poziomie projektu, o której mowa w http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run

 4
Author: suman j,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-01 11:32:22

@Marvin, dzięki za post był bardzo pomocny.

Dzielenie się tym, jak go używałem:

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

Mam testy JUnit, które chciałem pominąć, chyba że właściwość została użyta do włączenia takich testów. Użycie JUnit Assume do warunkowego włączenia testów:

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

Robienie tego z gradle wymagało, aby właściwość systemowa podana w czasie uruchamiania Gradle build, pokazana tutaj,

gradle build -Ddeep.test.run=true

Rzeczywiście przeszedł do testów.

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

 3
Author: Rishik Dhar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-28 05:14:06

Wydaje się działać:

bootRun {
    systemProperties "property1": "value1", "property2": "value2"
}
 1
Author: levsa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-11 20:00:38
bootRun {
  args = ['myProgramArgument1', 'myProgramArgument2']
}

Używanie jvmArgs może powodować problemy z uruchomieniem JVM. Używanie args pozwala na podanie własnych argumentów programu

 1
Author: Cristian Botiza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-05 15:28:37

Miałem podobny problem, bootRun potrzebował pewnych parametrów, ale nie chciałbym modyfikować bootruna, ponieważ chcę zachować pewną elastyczność i trzymać się standardowego zachowania bootruna. Moja sugestia polega na dodaniu 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 wykonywania skryptu, ale użyłem tego podejścia, aby przekazać profil spring za pomocą właściwości wiosna.profile.aktywny. Podziękowania należy kierować do Karola Kalińskiego

 0
Author: Evelino Bomitali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-03 08:20:58