2016-10-17 9 views
15

मेरे पास एक स्प्रिंग बूट एप्लिकेशन है और मैंने उसमें से एक जार बनाया है। बाद मेरी pom.xml है:किसी अन्य प्रोजेक्ट में स्प्रिंग बूट जार पर निर्भरता कैसे जोड़ें?

<dependencies> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-web</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-mail</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-thymeleaf</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.thymeleaf.extras</groupId> 
     <artifactId>thymeleaf-extras-java8time</artifactId> 
     <version>2.1.0.RELEASE</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-actuator</artifactId> 
    </dependency> 
    <!-- WebJars --> 
    <dependency> 
     <groupId>javax.mail</groupId> 
     <artifactId>mail</artifactId> 
     <version>1.4.7</version> 
    </dependency> 
    <dependency> 
     <groupId>com.google.code.gson</groupId> 
     <artifactId>gson</artifactId> 
     <version>2.6.2</version> 
    </dependency> 
</dependencies> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-maven-plugin</artifactId> 
     </plugin> 
    </plugins> 
</build> 

मैं अपने अन्य आवेदन तो अपने आवेदन को यह जार जोड़ा में यह जार का उपयोग करना चाहते। लेकिन जब मैं उस जार में एक विधि बुला रहा हूं, तो यह ClassNotFoundException फेंक रहा है।

मैं इस समस्या को कैसे ठीक कर सकता हूं? मैं स्प्रिंग बूट जार में निर्भरता कैसे जोड़ सकता हूं?

+0

आप वसंत-बूट-प्लगइन-मैनिपुलेटेड-जार का उपयोग "सामान्य" निर्भरता के रूप में नहीं कर सकते हैं, क्योंकि इसकी संरचना को वसंत के लिए एक स्टैंडअलोन जार के रूप में "प्रारंभ करने योग्य" के रूप में बदल दिया गया है। मैं अलग-अलग गैर-स्प्रिंग-बूट (इसलिए पारंपरिक लाइब्रेरी जेएआर) मॉड्यूल में दोनों ऐप्स में आवश्यक कोड निकालने का सुझाव दूंगा। – Tome

उत्तर

35

डिफ़ॉल्ट रूप से, स्प्रिंग बूट आपके जेएआर को निष्पादन योग्य जेएआर में दोबारा बदल देता है, और यह BOOT-INF/classes के अंदर अपने सभी वर्गों को डालकर और BOOT-INF/lib के अंदर सभी निर्भर पुस्तकालयों को डालकर करता है। इस वसा जेएआर बनाने का नतीजा यह है कि अब आप इसे अन्य परियोजनाओं के लिए निर्भरता के रूप में उपयोग नहीं कर सकते हैं।

Custom repackage classifier से

:

डिफ़ॉल्ट रूप से, repackage लक्ष्य repackaged एक साथ मूल विरूपण साक्ष्य की जगह लेगा। मॉड्यूल के लिए यह एक सौहार्दपूर्ण व्यवहार है जो एक ऐप का प्रतिनिधित्व करता है लेकिन यदि आपका मॉड्यूल किसी अन्य मॉड्यूल की निर्भरता के रूप में उपयोग किया जाता है, तो आपको पुन: संग्रहित व्यक्ति के लिए वर्गीकरण प्रदान करने की आवश्यकता होती है।

इसका कारण यह है कि आवेदन कक्षा BOOT-INF/classes में पैक की जाती है ताकि निर्भर मॉड्यूल एक पुन: संग्रहित जार के वर्गों को लोड न कर सके। इस विन्यास, स्प्रिंग बूट Maven के साथ

:

आप एक निर्भरता के रूप में इसका इस्तेमाल करने में मूल मुख्य विरूपण साक्ष्य रखना चाहते हैं, तो आप एक classifierrepackage लक्ष्य विन्यास में जोड़ सकते हैं प्लगइन 2 जेएआर बनाएगा: मुख्य एक सामान्य मैवेन प्रोजेक्ट जैसा ही होगा, जबकि दूसरे में वर्गीकृत जोड़ा जाएगा और निष्पादन योग्य जार होगा।

+1

तो जब 'एमवीएन क्लीन इंस्टॉल' चल रहा है तो जार फ़ाइल निर्भरता के रूप में उपयोग के लिए उपयुक्त होगी .m2 रिपॉजिटरी में जोड़ा जाएगा? – Hervian

2

क्या @Tunaki कहा ज्यादातर सही था, लेकिन एक अपने मूल प्रश्न के आधार पर हिस्सा गायब था:

यह फेंकने ClassNotFoundException। वसंत बूट एप्लिकेशन में उपयोग किया जाने वाला बाहरी जार गायब है।

यह इस तथ्य के कारण है कि मैवेन पैकेजिंग से बनाए गए फ़तजेर में एक विशिष्ट स्थान में निर्दिष्ट निर्भर पुस्तकालय हैं जो स्प्रिंग बूट एप्लिकेशन को निष्पादित करता है। यदि आप जार को किसी अन्य एप्लिकेशन के क्लासपाथ में जोड़ रहे हैं तो आपको वह करना चाहिए जो @ टुनकी ने कहा था और क्लासपाथ पर निर्भर जेएआर फाइल भी शामिल कराना चाहिए। इसके साथ काम करने का सबसे अच्छा तरीका Maven Dependency Plugin का उपयोग करना विशेष रूप से dependency:copy-dependencies मोोजो को किसी भी फ़ोल्डर में डाउनलोड करने के लिए लक्षित करना है जिसे आप अन्य एप्लिकेशन को संकलित करते समय लाइब्रेरी पथ के रूप में निर्दिष्ट कर सकते हैं।

0

आप अपनी परियोजनाओं को सेट कर सकते हैं ताकि बैच लॉन्चर एक जार पर निर्भर हो, जिसे आपके अन्य एप्लिकेशन के साथ साझा किया जाएगा।

ने कहा अलग ढंग से, अपने प्रारंभिक अनुरोध के अनुसार:

मैं अपने अन्य आवेदन तो अपने आवेदन को यह जार जोड़ा में यह जार का उपयोग करना चाहते।

मान लें कि आपका जार, अपनी परियोजना के एक है, और अपने आवेदन अब अपनी परियोजना बी

है, मैं क्या सुझाव है कि आप एक से शुरू हिस्से को हटाने है दो; फिर आप इसे एक नई परियोजना सी में डाल दें, जो स्प्रिंग बूट को एम्बेड करेगा, और यह लगभग पूरी तरह से ए

पर भरोसा करेगा, फिर ए, अब एक साधारण जार है, बी इसे निर्भरता के रूप में उपयोग कर सकता है।

0

आप Maven-विधानसभा-प्लगइन

<plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>3.1.0</version> 
     <configuration> 
     <descriptorRefs> 
       <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     </configuration> 
     <executions> 
     <execution> 
      <id>make-assembly</id> 
      <phase>package</phase> 
      <goals> 
      <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
</plugin> 

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

संबंधित मुद्दे