web-dev-qa-db-fra.com

Comment passer des options JVM à partir de bootRun

Je développe une application Web Spring simple qui communique avec un hôte distant et j'aimerais la tester localement derrière un proxy d'entreprise. J'utilise le plugin Gradle "Spring Boot" et la question est comment puis-je spécifier les paramètres de proxy pour JVM?

J'ai essayé plusieurs façons de le faire:

  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"

Mais il semble qu'aucun d'entre eux ne fonctionne - "NoRouteToHostException" ajoute du code "réseau". De plus, j'ai ajouté du code supplémentaire pour déboguer les arguments de démarrage de JVM:

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

Et un seul argument a été imprimé: "-Dfile.encoding = UTF-8".

Si je mets la propriété système dans le code:

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

Tout fonctionne très bien!

85
Evgeny

Réponse originale (avec Gradle 1.12 et Spring Boot 1.0.x):

La tâche bootRun du plugin Gradle Spring Boot étend la tâche JavaExec. Voir this .

Cela signifie que vous pouvez configurer le plug-in pour utiliser le proxy en ajoutant:

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

à votre fichier de construction.

Bien sûr, vous pouvez utiliser le systemProperties au lieu de jvmArgs

Si vous souhaitez ajouter de manière conditionnelle jvmArgs à partir de la ligne de commande, vous pouvez procéder comme suit:

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

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

Réponse mise à jour:

Après avoir essayé ma solution ci-dessus avec Spring Boot 1.2.6.RELEASE et Gradle 2.7, j'ai constaté que cela ne fonctionnait pas comme le mentionnent certains commentaires. Cependant, quelques ajustements mineurs peuvent être faits pour récupérer l'état de fonctionnement.

Le nouveau code est:

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

pour les arguments codés en dur, et

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

    }
}

pour les arguments fournis à partir de la ligne de commande

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

Cela devrait transmettre toutes les options de la machine virtuelle Java à l'application démarrée via bootRun.

62
Marvin Frommhold

Dans le script de construction Gradle, définissez systemProperties pour la tâche d'exécution.

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

et gradle run devrait accepter cette valeur.

Ou définissez une propriété au niveau du projet comme indiqué dans http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_run

6
suman j

@marvin, merci pour votre message, cela a été très utile.

Partage de comment je l'ai utilisé:

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

J'ai des tests JUnit que je voulais ignorer sauf si une propriété était utilisée pour inclure de tels tests. Utilisation de JUnit Supposer pour inclure les tests conditionnellement:

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

Faire cela avec gradle exigeait que la propriété système fournie au moment de la construction de gradle, montrée ici,

gradle build -Ddeep.test.run=true

était en effet passé aux tests.

J'espère que cela aidera les autres utilisateurs de cette approche à exécuter des tests de manière conditionnelle.

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

L'utilisation de jvmArgs peut entraîner des problèmes de démarrage de la machine virtuelle Java. Utiliser args vous permet de transmettre les arguments de votre programme personnalisé

2
Cristian Botiza

Cela semble fonctionner:

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

J'ai eu un problème similaire, bootRun avait besoin de certains paramètres mais je n'aurais pas envie de modifier bootRun car je souhaite conserver une certaine flexibilité et rester fidèle au comportement standard de bootRun. Ma suggestion est d'ajouter certaines tâches personnalisées (par exemple, bootRunDev, bootRunProxy) qui étend bootRun, comme décrit dans l'extrait de code suivant.

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

Je n'ai pas d'environnement pour exercer le script, mais j'ai utilisé cette approche pour passer de profil à spring en utilisant la propriété spring.profiles.active. Les crédits devraient aller à Karol Kaliński

1