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ć:
gradle -Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080 bootRun
export JAVA_OPTS="-Dhttp.proxyHost=X.X.X.X -Dhttp.proxyPort=8080"
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! 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ń
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
.
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
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.
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"
}
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
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
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