JVM विकल्प को bootRun से कैसे पास करें


99

मैं सरल स्प्रिंग वेब एप्लिकेशन विकसित कर रहा हूं जो दूरस्थ होस्ट के साथ संचार करता है और मैं इसे स्थानीय रूप से कॉर्पोरेट प्रॉक्सी के पीछे परीक्षण करना चाहूंगा। मैं "स्प्रिंग बूट" ग्रेडल प्लगइन का उपयोग करता हूं और सवाल यह है कि मैं जेवीएम के लिए प्रॉक्सी सेटिंग्स कैसे निर्दिष्ट कर सकता हूं?

मेरे पास इसे करने के कई तरीके हैं:

  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"

लेकिन ऐसा लगता है कि उनमें से कोई भी काम नहीं करता है - "NoRouteToHostException" "नेटवर्क" कोड में फेंकता है। इसके अलावा, मैंने JVM के आरंभिक तर्कों पर बहस करने के लिए कुछ अतिरिक्त कोड जोड़े हैं:

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

और केवल एक तर्क मुद्रित किया गया था: "-Dfile.encoding = UTF-8"।

अगर मैंने कोड में सिस्टम प्रॉपर्टी सेट की है:

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

सब कुछ ठीक काम करता है!

जवाबों:


107

मूल उत्तर (ग्रेड 1.12 और स्प्रिंग बूट 1.0.x का उपयोग करके):

bootRunस्प्रिंग बूट Gradle प्लगइन का कार्य Gradle JavaExec कार्य फैली हुई है। देखें इस

इसका मतलब है कि आप प्रॉक्सी को जोड़ने के लिए प्लग इन को कॉन्फ़िगर कर सकते हैं:

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

अपनी बिल्ड फ़ाइल में।

बेशक आप systemPropertiesइसके बजाय उपयोग कर सकते हैंjvmArgs

यदि आप कमांड लाइन से सशर्त रूप से jvmArgs जोड़ना चाहते हैं तो आप निम्नलिखित कार्य कर सकते हैं:

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

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

अपडेट किया गया उत्तर:

स्प्रिंग बूट 1.2.6.RASEASE और ग्रेडल 2.7 का उपयोग करके ऊपर दिए गए मेरे समाधान को आज़माने के बाद मैंने देखा कि यह कुछ टिप्पणियों के रूप में काम नहीं कर रहा था। हालांकि, काम करने की स्थिति को ठीक करने के लिए कुछ मामूली बदलाव किए जा सकते हैं।

नया कोड है:

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

हार्ड-कोडित तर्कों के लिए, और

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

    }
}

कमांड लाइन से दिए गए तर्कों के लिए


4
मैं बिल्ड फ़ाइल में इस विकल्प को "हार्डकोड" नहीं करना चाहूंगा। प्रॉक्सी सेटिंग्स निर्दिष्ट करने की संभावना होना बहुत अच्छा होगा। यानी - कमांड-लाइन तर्कों का उपयोग करना।
एवगेनी

काम नहीं करता है: "> रूट प्रोजेक्ट पर संपत्ति 'आर्ग' नहीं मिल सका"।
एवगेनी

क्या आपने सही तरीके से कोड कॉपी किया था? मैंने एक अपडेट किया है। कोई argsसंपत्ति नहीं है।
जियोन्ड

7
मैंने आज कोशिश की और इस काम का एकमात्र तरीका है, वर्गाकार कोष्ठकों द्वारा स्ट्रिंग की सूची को बूट करना, जैसे बूटरून {jvmArgs = ["-Dhttp.proxyHost = xxxxxx", "-Dttp.proxyPort = xxxxxx"]}
वैलेंटिनो डेल '। आइका

आप किस संस्करण का उपयोग कर रहे हैं?
जियोन्ड

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

इसके माध्यम से शुरू किए गए एप्लिकेशन को सभी जेवीएम विकल्पों को पास करना चाहिए bootRun


2
JVM
anubhava

@ मारविन फ्रॉमहोल्ड, आपके उत्तर के लिए धन्यवाद। दृष्टिकोण अविश्वसनीय रूप से सीधा है। मेरे जैसे नोक-झोंक के लिए, यदि आप थोड़ा और विस्तार जोड़ लें तो यह मददगार होगा। सुझाव: (1) तर्क के साथ ग्रेड कमांड लाइन कॉल दिखाएं; (२) स्प्रिंग बूट में तर्कों का संदर्भ देने का तरीका दिखाएं, जैसे @Value ("$ {संपत्ति: डिफ़ॉल्ट}"); (3) इंटेलीज संवाद का एक पैरामेट्स पासिंग भी सहायक होगा।
ब्रेट

1
अफसोस की बात है, मेरे लिए, बस इस कारण को जोड़ने के लिए bootRun जोड़कर "org.apache.catalina.LifecycleException:" के दौरान एक बच्चा कंटेनर शुरू में विफल रहा है "यहां तक ​​कि किसी भी-डी
पैरामस

करने के लिए चेरी उठा गुण मैं एक जवाब के रूप में चाहते हैं द्वारा हल stackoverflow.com/questions/23689054
tkruse

7

ग्रेड बिल्ड स्क्रिप्ट में, रन टास्क के लिए systemProperties को परिभाषित करें।

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

और gradle runइस मूल्य को स्वीकार करना चाहिए।

या http://forums.gradle.org/gradle/topics/how_can_i_provide_command_line_args_to_application_started_with_gradle_unun में बताए गए प्रोजेक्ट स्तर की संपत्ति को परिभाषित करें


1
हां, यह समाधान काम करता है। लेकिन मैं इस कोड को स्रोत नियंत्रण में नहीं रखना चाहूंगा। मेरा मानना ​​है कि "सबसे सही" समाधान इस विकल्प को सीधे कमांड लाइन में पारित करना है। क्या इसके लिए कोई रास्ता है?
एवगेनी

1
पोस्ट में उल्लिखित लिंक में कमांड लाइन से उन्हें पास करने का एक तरीका है
सम्मन j

5

@marvin, आपकी पोस्ट के लिए धन्यवाद यह बहुत मददगार था।

साझा करना कि मैंने इसका उपयोग कैसे किया:

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

मेरे पास JUnit परीक्षण हैं जिन्हें मैं छोड़ना चाहता था जब तक कि इस तरह के परीक्षणों को शामिल करने के लिए एक संपत्ति का उपयोग नहीं किया जाता था। सशर्त रूप से परीक्षणों को शामिल करने के लिए JUnit Assume का उपयोग करना:

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

ऐसा करने के लिए यह आवश्यक है कि रनिंग ग्रेड के निर्माण के समय प्रदान की गई सिस्टम प्रॉपर्टी को यहां दिखाया गया हो,

gradle build -Ddeep.test.run=true

वास्तव में परीक्षणों के माध्यम से पारित किया गया था।

उम्मीद है कि यह दूसरों को सशर्त रूप से परीक्षण चलाने के लिए इस दृष्टिकोण की कोशिश करने में मदद करता है।


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

JvmArgs का उपयोग करने से JVM के शुरू होने की समस्या हो सकती है। आर्गन्स का उपयोग करने से आप अपने कस्टम प्रोग्राम के तर्कों को पारित कर सकते हैं


क्या आप मुझे दिखा सकते हैं कि Application.class या Bootstrap.class में इन तर्कों का उपयोग कैसे करें? (मैं अनाज 3.xx का उपयोग कर रहा हूं)
स्टेफानो स्कार्पांति

2

यह काम करने लगता है:

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

1

मैं एक समान समस्या में आ गया, बूटरुन को कुछ मापदंडों की आवश्यकता थी, लेकिन मैं बूटरुन को संशोधित करने की तरह महसूस नहीं करूंगा क्योंकि मैं कुछ लचीलेपन को रखना चाहता हूं और मानक बूटरुन व्यवहार को छड़ी करना चाहता हूं। मेरा सुझाव कुछ कस्टम कार्यों को जोड़ने के लिए है (चलिए bootRunDev, bootRunProxy कहते हैं) जो bootRun को बढ़ाता है, जैसा कि निम्नलिखित कोड स्निपेट में वर्णित है

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

मेरे पास स्क्रिप्ट का उपयोग करने के लिए एक वातावरण नहीं है, लेकिन मैंने संपत्ति वसंत का उपयोग करके प्रोफ़ाइल को वसंत में भेजने के लिए इस दृष्टिकोण का उपयोग किया। क्रेडिट को करोल कलिस्की जाना चाहिए

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.