spring स्प्रिंग बूट में चुनौतीपूर्ण निर्भरता कैसे अपग्रेड करें?(नमूना मामले: वसंत डेटा)



maven spring-boot (1)

मैं स्प्रिंग बूट (1.4.1) के वसंत डेटा जेपीए स्टार्टर का उपयोग करता हूं। इसमें स्प्रिंग डाटा जेपीए 1.10.3 है। हालांकि, मुझे @DomainEvents एनोटेशन का उपयोग करने की आवश्यकता है जो अभी तक इस संस्करण स्प्रिंग डेटा में मौजूद नहीं है जब मैं स्प्रिंग डेटा जेपीए के नवीनतम संस्करण को जोड़ने का प्रयास करता हूं, तब जब मेरे एप्लीकेशन को चलाने में त्रुटियां मिलती हैं I

मेरा पोम उदाहरण:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.1.RELEASE</version>
        <relativePath/>
</parent>

<dependencies>
        ...
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        ...
</dependencies>

जब मैं स्प्रिंग डेटा जेपीए के नवीनतम संस्करण को जोड़ने की कोशिश करता हूं:

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-jpa</artifactId>
            <version>1.11.6.RELEASE</version>
        </dependency>
    </dependencies>
</dependencyManagement>

जब मैं अपना ऐप शुरू करता हूँ तो मुझे इरोर्स मिलता है इस तरह की त्रुटियां:

Caused by: java.lang.NoSuchMethodException: org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.<init>()
  at java.lang.Class.getConstructor0(Class.java:3082) ~[na:1.8.0_121]
  at java.lang.Class.getDeclaredConstructor(Class.java:2178) ~[na:1.8.0_121]
  at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:80) ~[spring-beans-4.3.3.RELEASE.jar:4.3.3.RELEASE]
  ... 53 common frames omitted

मैं स्प्रिंग डाटा जेपीए के नए संस्करण का उपयोग कैसे कर सकता हूं? मेरे ऐप में @DomainEvents की आवश्यकता है @DomainEvents धन्यवाद!


यहां बिल्ली को चमचाने के कई तरीके हैं जो सभी अलग- ऊपर और नीचे की ओर आते हैं:

विकल्प 1: बूट के नए संस्करण को अपग्रेड करना

सबसे सुरक्षित तरीका स्प्रिंग बूट के एक अधिक हाल के संस्करण में अपग्रेड करना है हम आम तौर पर वर्तमान प्रमुख पीढ़ी के नवीनतम लघु संस्करण पर होने की सलाह देते हैं। आपके मामले में 1.5 सबसे हाल ही में नाबालिग है, इसलिए हम उस पर अपग्रेड करने की सलाह देते हैं (वर्तमान में 1.5.6)। यह आमतौर पर आपके द्वारा उपयोग किए जाने वाले पैरेंट पॉम की संस्करण संख्या को बदलकर ही प्राप्त किया जाता है।

<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>1.5.6.RELEASE</version>
</parent>

पेशेवरों

  • आप अपने नवीनतम , संगत संस्करणों में सभी बूट प्रबंधित निर्भरताओं को स्वचालित रूप से अपग्रेड करेंगे। यह सलाह दी जाती है क्योंकि यह सुनिश्चित करेगा कि आपको तृतीय पक्ष निर्भरता में सुरक्षा अद्यतनों के लिए नवीनतम सुधार मिले

विपक्ष

  • यदि आप अपने एप्लिकेशन कोड से तृतीय-पक्ष एपीआई पर निर्भर करते हैं, तो एक मामूली संस्करण अपग्रेड आपको अपने कॉन्फ़िगरेशन या एपीआई के बारे में कुछ चीजें बदलने की आवश्यकता हो सकती है। बूट में मामूली संस्करण अपग्रेड आम तौर पर बहुत सावधान होते हैं जब यह तीसरे पक्ष के लिबी में परिवर्तन को तोड़ने में नहीं आता है, लेकिन दुर्भाग्य से ये सभी सिमेंटिक संस्करण का पालन नहीं करते हैं। हालांकि, अगर आपके पास एक अच्छा परीक्षण सूट है तो यह पता लगाना आसान होना चाहिए कि आप समस्याओं में चले जाएंगे या नहीं। रिलीज़ नोट्स पर ध्यान देने की सलाह दी जाती है क्योंकि वे आमतौर पर माइग्रेशन गाइड होते हैं।

विकल्प 2: निर्भरता को व्यक्तिगत रूप से अपग्रेड करना

पिछले दृष्टिकोण का एक विकल्प बूट संस्करण पर रहा है, लेकिन आप तीसरी पार्टी निर्भरता को चुनिंदा रूप से अपग्रेड कर रहे हैं। ऐसा करने का पसंदीदा तरीका यह है कि स्प्रिंग-बूट-निर्भरता में कौन से संस्करण प्लेसहोल्डर मौजूद हैं। तो आपको बस अपने प्रोजेक्ट में प्रॉपर्टी को दोबारा तैयार करने और संस्करण को ज़ूम करने की आवश्यकता है। स्प्रिंग डाटा के लिए, यह होगा:

<properties>
  <spring-data-releasetrain.version>Ingalls-SR6<spring-data-releasetrain.verion>
</properties>

स्प्रिंग डाटा के मामले में आप एक बार यहां पूरी रीलीज ट्रेन को अपग्रेड कर रहे हैं ताकि आप स्प्रिंग डाटा मॉड्यूल के बीच असंगतता में न चलें, अगर आप केवल एक मॉड्यूल का उन्नयन करते हैं। यह मुख्य कारणों में से एक है जिसे "संपत्ति से उन्नयन" की सिफारिश की जाती है एक नए संस्करण में एक निर्भरता को स्पष्ट रूप से घोषित करना (जो कुछ मामलों में अभी भी अंतिम उपाय हो सकता है)।

पेशेवरों

  • उन्नयन बहुत अधिक चयनात्मक संचालन है। पिछले दृष्टिकोण के विपरीत, आप असंबंधित निर्भरता के उन्नयन समस्याओं में चलने का जोखिम नहीं उठा रहे हैं।

विपक्ष

  • यह काम नहीं कर सकता! - कभी-कभी निर्भरता कुछ आंतरिक एपीआई बदलती हैं जो कि बूट की स्वत: विन्यास छोटी रिहाई में निर्भर करती है। यह स्वत: कॉन्फ़िगरेशन को स्टार्टअप पर काम नहीं करने का कारण हो सकता है, जिसे आप स्वतः कॉन्फ़िगरेशन को स्पष्ट रूप से छोड़कर और मैन्युअल कॉन्फ़िगरेशन लिखकर प्रतिस्थापित करने का प्रयास कर सकते हैं।

सुझाए गए कदम

व्यवहार में मैं आम तौर पर निम्न चरणों का प्रयास करता हूं:

  1. संभव के रूप में छोटा प्रभाव के साथ अपग्रेड करने के लिए विकल्प 1 का उपयोग करें यदि यह सफल होता है: हो गया
  2. यदि वह समस्याओं का कारण बनता है, तो मूल्यांकन करें कि मैन्युअल कॉन्फ़िग के साथ स्वतः कॉन्फ़िगरेशन को बदलने के लिए कितना कठिन है (आमतौर पर बूट के साथ अंतर्दृष्टि और अनुभव की थोड़ी आवश्यकता होती है। यदि वह सफल होता है: पूर्ण हुआ
  3. बूट के एक नए संस्करण में अपग्रेड करने के लिए विकल्प 2 का उपयोग करें और अपने एप्लिकेशन कोड पर होने वाले प्रभाव का मूल्यांकन करें।

2 और 3 पर निर्भर करता है कि आप व्यक्तिगत रूप से क्या पसंद करते हैं या आप अपनी टीम के लिए परिभाषित निर्भरता अपग्रेड नीति पर निर्भर करते हैं।

आम तौर पर बोलना यह एक अच्छा विचार है कि बूट रिलीज पर नज़र रखना और इस नए संस्करण को नियमित रूप से सूखे-अपग्रेड करने का प्रयास किया जाता है, लेकिन जरूरी नहीं कि यह उत्पादन को अपग्रेड कर दें। इससे आपको इस काम में आने वाले कार्यों की उन्नयन और अनुमान लगाने के जोखिम का मूल्यांकन करने की अनुमति मिलती है। मूल रूप से उन्नयन से बचने से उन्हें अधिक दर्द होता है , लेकिन हां, कभी-कभी राजनैतिक कारणों से या फिर नए संस्करणों में समस्याएं चल रही हैं, इसलिए उन्हें तुरंत नहीं बनाया जा सकता।





dependency-management