2011-03-13 16 views
20

मेरे मेवेन प्रोजेक्ट में एक मॉड्यूल (कोर) है जिसमें इसकी कक्षाओं के लिए कुछ संसाधन हैं। मॉड्यूल के अंदर कक्षाएं चलाने के दौरान अपने संसाधन प्राप्त करने में सक्षम होते हैं। सब कुछ ठीक काम करता है।निर्भरता के संसाधनों का उपयोग करें?

जहां सामान तोड़ता है जब कोर पर निर्भर करता है कि एक और मॉड्यूल उस वर्ग को चलाने की कोशिश करता है। वह फ़ोल्डर जो जावा संसाधनों की तलाश में है, वह मॉड्यूल है, कोर मॉड्यूल नहीं। तो वर्ग विफल रहता है।

संक्षेप में: मैं निर्भरता के संसाधनों का उपयोग कैसे कर सकता हूं?


मैं कोर के जार प्रकट Class-Path: . में घोषणा के द्वारा ऐसा करने की कोशिश कर के साथ प्रयोग किया गया है। लेकिन जब संसाधन उपलब्ध लिस्टिंग के साथ JSHookLoader.class.getClassLoader().getResources(""); (यह कुछ भी अर्थ है कि यदि JSHookLoader कोर में है), मैं मिलता है:

Resource: W:\programming\quackbot-hg\impl\target\classes 
File rebel.xml 

Resource: W:\programming\maven-repo\org\quackbot\core\3.5-SNAPSHOT 
File core-3.5-SNAPSHOT.jar 
File core-3.5-SNAPSHOT.pom 
File maven-metadata-local.xml 
File _maven.repositories 

यह निश्चित रूप से चीजों को पेचीदा हो के रूप में मैं जार ही क्लासपाथ में होने की उम्मीद, नहीं निर्देशिका JAR

कोई सुझाव है?


इस परियोजना पर वापस आकर मुझे अभी भी यह समस्या है। अन्य गाइडों ने मैवेन-असेंबली-प्लगइन और दूरस्थ संसाधन प्लगइन का उपयोग करने के बारे में बात की है, लेकिन यह बहुत दर्द है क्योंकि सभी मॉड्यूल में राक्षस प्लगइन एक्सएमएल शामिल करना है।

मैं इस सवाल को सरल क्यों नहीं बना सकता: मैं संसाधन सूची में निर्भरता JAR कैसे जोड़ सकता हूं?

  1. core.jar में फ़ोल्डर/संसाधनों के तहत इसमें कुछ संसाधन हैं। Core.jar चल रहा है मैं संसाधन सूची में देख/संसाधन देख सकता हूं।
  2. impl.jar core.jar पर निर्भर करता है। इसे चलाने पर/संसाधन संसाधन सूची में नहीं है और इसलिए विनाश का कारण बनता है।

यह काफी आसान होना चाहिए, लेकिन मैं इसे कैसे कर सकता हूं? मैंने ऐसा करने के लिए एक आसान साफ ​​तरीका जानने के लिए घंटों खर्च किए हैं लेकिन इसका कोई फायदा नहीं हुआ है।

उत्तर

21

खोज रहा अंत में एक समाधान पर ठोकर खाई के बहुत सारे के बाद।

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

कारण मैं असेंबली प्लगइन या दूरस्थ संसाधन प्लगइन का उपयोग नहीं कर रहा हूं क्योंकि वे समर्पित संसाधन मॉड्यूल का उपयोग करते हैं। मुझे नहीं लगता कि मुझे मूल मॉड्यूल और कोर-संसाधन मॉड्यूल बनाना होगा, कोर-संसाधन मॉड्यूल के साथ केवल लॉगबैक और हाइबरनेट कॉन्फ़िगरेशन फ़ाइलें + कुछ अन्य सामान शामिल हैं।

यहाँ मैं इस

<build> 
     <plugins> 
      <!--Extract core's resources--> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-dependency-plugin</artifactId> 
       <version>2.2</version> 
       <executions> 
        <execution> 
         <id>unpack</id> 
         <phase>generate-resources</phase> 
         <goals> 
          <goal>unpack-dependencies</goal> 
         </goals> 
         <configuration> 
          <includeGroupIds>${project.groupId}</includeGroupIds> 
          <includeArtifactIds>core</includeArtifactIds> 
          <excludeTransitive>true</excludeTransitive> 
          <overWrite>true</overWrite> 
          <outputDirectory>${project.build.directory}/core-resources</outputDirectory> 
          <excludes>org/**,META-INF/**,rebel.xml</excludes> 
          <overWriteReleases>true</overWriteReleases> 
          <overWriteSnapshots>true</overWriteSnapshots> 
         </configuration> 
        </execution> 
       </executions> 
      </plugin> 
     </plugins> 
     <!--New resource locations--> 
     <resources> 
      <resource> 
       <filtering>false</filtering> 
       <directory>${project.build.directory}/core-resources</directory> 
      </resource> 
      <resource> 
       <filtering>false</filtering> 
       <directory>${basedir}/src/main/resources</directory> 
      </resource> 
     </resources> 
    </build> 
+0

आपके समाधान को पोस्ट करने के लिए बहुत बहुत धन्यवाद! मुझे यह सही समस्या है और मुझे एक जवाब मिला है ... लेकिन यह मैवेन शब्दों में लिखा गया था, और मैं इसे समझने के लिए संघर्ष कर रहा था। – CaffiendFrog

+1

इसका उपयोग करते समय परिपत्र निर्भरताओं से सावधान रहें। आपको जारी करने में कठिनाइयां हो सकती हैं। – Michael

3

संसाधनों जार में /src/main/resourcesऔर कक्षाओं में रहते हैं, तो उन्हें प्रयोग getResourceAsStream() तक पहुँच रहे हैं, तो आप अन्य जार में कक्षाओं से इन फ़ाइलों का उपयोग करने के साथ ही (भी getResourceAsStream() का प्रयोग करके) सक्षम होना चाहिए। ऐसा इसलिए है क्योंकि /src/main/resources में स्थित सभी फाइलें अंततः एक ही लॉजिकल निर्देशिका (CLASSPATH) में उतरती हैं। दूसरे शब्दों में: /src/main/resources में स्थित सभी फाइलें और /src/main/java से संकलित सभी कक्षाएं को एक ही नामस्थान में विलय करने के लिए कहती हैं।

यदि आप अभी भी फाइलों तक नहीं पहुंच सकते हैं, भले ही सभी कक्षाएं वर्दी getResourceAsStream() एपीआई का उपयोग कर रही हों, तो आपके पास कुछ क्लास-लोडिंग दृश्यता समस्याएं हो सकती हैं।

+0

मेरे प्रश्न में अद्यतन देखें, यह काम नहीं कर रहा है जैसा आपने कहा था। – TheLQ

0

मुझे नहीं लगता कि यह एक अच्छा विचार है। मान लें कि आपके पास मॉड्यूल A है। यह 'बी' से निर्भर करता है। 'बी' C से निर्भर करता है। असल में, आपको केवल A में B मॉड्यूल के इंटरफ़ेस के बारे में ध्यान रखना चाहिए। शायद, कल यह C से D पर निर्भरता बदलता है। यदि ऐसा होता है तो आपको A बदलने की आवश्यकता होगी। यह अच्छी स्थिति नहीं है, है ना?इसलिए C से निर्भरता A पर निर्भरता घोषित करें।

संक्षेप में: मैं निर्भरता के संसाधनों का उपयोग कैसे कर सकता हूं?

संक्षेप में: इस निर्भरता को सीधे घोषित करें।

+0

इसे सीधे घोषित किया गया है। जिस मॉड्यूल के बारे में मैं सीधे बात कर रहा हूं वह कोर पर निर्भर करता है। – TheLQ

1

अपने निर्भर जार एक वर्ग नामित OneDependent है, तो यह काम करना चाहिए:

OneDependent.class.getResourceAsStream(resourcePath) 
+0

यही मैंने किया था। यह केवल कोर जेएआर निर्देशिका में दिखाया गया था, इसकी सामग्री नहीं। – TheLQ

+0

यह समझने की कोशिश कर रहा है कि आप किस निर्देशिका के बारे में बात कर रहे हैं ... getResourceAsStream() कॉल या तो आपको संसाधन या शून्य नहीं देता है अगर यह संसाधन नहीं ढूंढ पाता है। यह आपके मामले में क्या वापस आता है? –

+1

मैंने 'JSHookLoader.class.getClassLoader() के साथ वापस लौटाया गया था। GetResources (""); ' – TheLQ

0

मैं बस अब एक ऐसी ही स्थिति थी करने के लिए उपयोग कर रहा हूँ की एक प्रति है। मेरे पास "टेस्ट कोड बिल्डर" है जो src/test/resource निर्देशिका से डेटा लेता है और H2 डेटाबेस में डेटा को पंप करता है। मॉड्यूल ए से ठीक काम करता है, लेकिन जब मॉड्यूल बी से कहा जाता है तो यह नहीं था। यह कई अर्ध-कॉलन के साथ एक पथ बनाता है (जार फ़ाइल में संसाधनों के कारण); मॉड्यूलए तब फ़ाइलों को "खुद के लिए स्थानीय" ढूंढने में विफल रहता है।

अंत में, मैं moduleB के निर्माण खंड के

<testResources> 
     <testResource> 
      <directory>src/test/resources</directory> 
     </testResource> 
     <testResource> 
      <directory>../moduleA/src/test/resources</directory> 
     </testResource> 
    </testResources> 

जोड़ा है, और अब निर्माण ठीक के माध्यम से और अपेक्षा के अनुरूप चलाता है।

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