2016-01-23 21 views
5

में Gradle.build संस्करण प्राप्त करना मैं एक दृश्य में अपने स्प्रिंग बूट एप्लिकेशन के अनुप्रयोग संस्करण को प्रदर्शित करने का प्रयास कर रहा हूं। मुझे यकीन है कि मैं इस संस्करण की जानकारी तक पहुंच सकता हूं, मुझे नहीं पता कि कैसे।स्प्रिंग बूट

मैं इस जानकारी निम्नलिखित की कोशिश की: https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-endpoints.html, और मेरे application.properties में रखते:

info.build.version=${version} 

और फिर मेरी नियंत्रक में यह @Value("${version.test}") लोड हो रहा है, लेकिन वह काम नहीं करता, मैं सिर्फ तरह त्रुटियों मिलती है:

Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'version' in string value "${version}" 

मेरे नियंत्रक में मेरे ऐप संस्करण, वसंत बूट संस्करण, आदि जैसी जानकारी प्राप्त करने का उचित तरीका क्या है?

+0

आप अपने वसंत बूट ऐप से प्रोग्रामेटिक रूप से ग्रेडल बिल्ड स्क्रिप्ट चर (जैसे संस्करण) तक पहुंच बनाना चाहते हैं? – RaGe

+0

@RaGe हाँ, यही वही है जो मैं चाहता हूं। –

+0

@Eric क्या आप अंततः ऐसा करने में कामयाब रहे हैं? –

उत्तर

5

described in the reference documentation रूप में, आप Gradle निर्देश देने के लिए आप आवेदन के संसाधनों पर कार्रवाई करने के इतना है कि यह परियोजना के संस्करण के साथ ${version} प्लेसहोल्डर का स्थान ले लेगा की जरूरत है:

processResources { 
    expand(project.properties) 
} 

सुरक्षा के लिए, आप चीजों को कम कर सकते हैं ताकि केवल application.properties संसाधित किया जाता है:

processResources { 
    filesMatching('application.properties') { 
     expand(project.properties) 
    } 
} 

अब, यह सोचते हैं कि अपनी संपत्ति info.build.version नाम पर है, यह उपलब्ध @Value के माध्यम से हो जाएगा:

@Value("${info.build.version}") 
+0

हाय एंडी, उत्तर के लिए धन्यवाद।मैंने यह कोशिश की है, लेकिन जब भी मैं अपने आईडीई से स्प्रिंग बूट एप्लिकेशन चलाता हूं, तो मुझे त्रुटि मिलती है: स्ट्रिंग मान "$ {version}" में प्लेसहोल्डर 'संस्करण' को हल नहीं किया जा सका। मैंने इसे अपने application.properties में जोड़ा: 'info.build.version = $ {version}', और यह मेरे नियंत्रक के लिए: '@ वैल्यू (" $ {info.build.version} ") निजी स्ट्रिंग एप्लिकेशन संस्करण;' –

+0

@ ErikPragt आप किस आईडीई का उपयोग कर रहे हैं, और आपने अपनी ग्रैडल प्रोजेक्ट को कैसे आयात किया है, इस पर निर्भर करता है कि ग्रैडल शायद नहीं चल रहा है, इसलिए इसे आपके application.properties फ़ाइल को संसाधित करने का मौका नहीं मिला है। क्या यह कमांड लाइन पर काम करता है (उदाहरण के लिए, './gradlew bootRun')? –

+0

हां, यह निश्चित रूप से मेरे बारे में थोड़ा मूर्खतापूर्ण है, मैं इसे अपने आईडीई से चलाता हूं, न कि ग्रैडल से। क्या ऐसा करने का एक तरीका भी है कि यह हमेशा काम करता है? उदाहरण के लिए, स्प्रिंग बूट का ResourceBanner.java एक समान चीज़ करता है .... –

0

मैं इसे इस तरह से हल कर लिया है: परिभाषित करें अपने application.properties में info.build.version:

info.build.version=whatever 

@Value("${info.build.version}") 
private String version; 

अब के साथ अपने घटक में इसका इस्तेमाल अपने build.gradle फाइल करने के लिए अपने संस्करण जानकारी जोड़ने इस तरह:

version = '0.0.2-SNAPSHOT' 
01 अंत में

def updateApplicationProperties() { 
    def configFile = new File('src/main/resources/application.properties') 
    println "updating version to '${version}' in ${configFile}" 
    String configContent = configFile.getText('UTF-8') 
    configContent = configContent.replaceAll(/info\.build\.version=.*/, "info.build.version=${version}") 
    configFile.write(configContent, 'UTF-8') 
} 

, यह सुनिश्चित करें विधि कहा जाता है जब आप build या bootRun को गति प्रदान:

तो एक तरीका है अपने application.properties को बदलने के लिए एक regex के साथ वहां अपनी संस्करण जानकारी अद्यतन करने के लिए जोड़ने के

allprojects { 
    updateVersion() 
} 

यह है कि। यह समाधान काम करता है यदि आप ग्रैडल को अपने ऐप को संकलित करते हैं और साथ ही यदि आप आईडीई से अपना स्प्रिंग बूट ऐप चलाते हैं। मान अपडेट नहीं किया जाएगा, लेकिन अपवाद नहीं फेंक देगा और जैसे ही आप ग्रैडल चलाएंगे, इसे फिर से अपडेट किया जाएगा।

मुझे आशा है कि इससे दूसरों की मदद मिलेगी और साथ ही यह मेरे लिए समस्या हल हो जाएगी। मुझे एक और उचित समाधान नहीं मिला, इसलिए मैंने इसे स्वयं ही लिखा।