2010-04-28 26 views
20

मेरे पास निम्न प्रोजेक्ट संरचना के साथ जावा एप्लिकेशन है:जार फ़ाइल से गुण फ़ाइल को कैसे निकालें?

myProject 
    | 
    |----src 
    |  | 
    |  |--main 
    |  | 
    |  |--resources 
    |   | 
    |   |--userConfig.properties 
    |   |--log4j.properties 
    | 
    |---target 

मैं अपनी परियोजना बनाने के लिए Maven का उपयोग कर रहा हूं। मैं jar फ़ाइल बनाने के लिए maven कमांड का उपयोग कर रहा हूं:

mvn package -DMaven.test.skip=true 

मैं अपनी जेएआर फ़ाइल से userConfig.properties फ़ाइल को बाहर करना चाहता हूं इसलिए मैंने अपने pom.xml को निम्नानुसार अपडेट किया है:

<excludes> 
    <exclude>**/userConfig.properties</exclude> 
</excludes> 

लेकिन यह इसमें से बाहर है लक्षित फ़ोल्डर जिसमें संकलित कोड रहता है। और एप्लिकेशन नहीं चलाया जाएगा क्योंकि यह userConfig.properties फ़ाइल नहीं ढूंढ पा रहा है।

क्या कोई मेरी मदद कर सकता है?

+0

आपका प्रश्न कोई मतलब नहीं बना है। आप कहते हैं कि आप एक फ़ाइल को बाहर निकालना चाहते हैं, लेकिन फिर आप का कहना है कि अपने app क्योंकि फ़ाइल बाहर रखा गया है काम नहीं करता। तो आप इसे पहली जगह क्यों बाहर करना चाहते थे? –

+0

आप स्प्रिंग ढांचे का उपयोग कर रहे हैं? –

+0

हाँ, क्रिस मैं स्प्रिंग फ्रेमवर्क का उपयोग कर रहा। –

उत्तर

9

आप this पर एक शोर लेते हैं।

<project> 
    ... 
    <build> 
    <plugins> 
     ... 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.3</version> 
     <configuration> 
      <excludes> 
      <exclude>**/userConfig.properties</exclude> 
      </excludes> 
     </configuration> 
     </plugin> 
     ... 
    </plugins> 
    </build> 
    ... 
</project> 
1

मुझे लगता है कि आप शायद पहले से ही इसे सही ढंग से कर रहे हैं, जहां के लिए कॉन्फ़िगर है कि को बाहर के आधार पर (jar tf के साथ जांच क्या वास्तव में फ़ाइलों को अपने जार में हैं)। सबसे अधिक संभावना है, आप परेशानी में भाग रहे हैं क्योंकि फ़ाइल आपके क्लासपाथ पर नहीं है और इस प्रकार आपका ऐप इसे नहीं ढूंढ सकता है। क्लासपाथ में संसाधन फ़ाइल के साथ निर्देशिका जोड़ने का प्रयास करें।

आप कुछ डिफ़ॉल्ट में डालना चाहते हैं और क्लासपाथ से गड़बड़ होने से बचने के लिए एप्लिकेशन को पूर्वनिर्धारित पथ से इसकी कॉन्फ़िगरेशन में पढ़ना चाहते हैं।

38

मुझे इस परिदृश्य का भी सामना करना पड़ा। असल में, आप कुछ उपयोगकर्ताConfig.properties फ़ाइल का उपयोग करके आसानी से सुलभ हो सकते हैं, जैसे कि /src/main/resources के अंदर, ग्रहण से स्थानीय रूप से अपना कोड चलाने में सक्षम होना चाहते हैं। इसके अतिरिक्त, आप एक बाहरी उपयोगकर्ता कॉन्फ़िगर.प्रोपर्टीज के साथ एक संकलित निष्पादन योग्य JAR प्रदान करना चाहते हैं जो उपयोगकर्ता को JAR को क्रैक किए बिना एप्लिकेशन को कॉन्फ़िगर करने की अनुमति देता है।

मेरे कार्यान्वयन इस प्रकार है: चल mvn clean install देगा:

  • निर्दिष्ट mainClass
  • के साथ निष्पादन योग्य जार बनाने के एक lib फ़ोल्डर में
  • प्रति परियोजना निर्भरता सभी .properties जार से src/main/resources में स्थित फ़ाइलों को बाहर आपकी परियोजना रूट में
  • src/main/resources मेंमें स्थित सभी .properties फ़ाइलों की प्रतिलिपि बनाएँ आपकी परियोजना रूट मेंफ़ोल्डर। ध्यान दें कि यह चरण JAR के आपके उपयोगकर्ताओं के लिए एक वैकल्पिक सुविधा है। आपको conf निर्देशिका में स्पष्ट रूप से इस फ़ाइल को बनाने की आवश्यकता हो सकती है। यह conf निर्देशिका मैनिफेस्ट के माध्यम से आपके रनटाइम क्लासपाथ में प्रभावी रूप से जोड़ा जाता है।
  • प्रकट करने के लिए इस conf फ़ोल्डर जोड़ने के लिए, अपने निष्पादन योग्य JAR

से उस तक पहुँच उपलब्ध कराने के अपने पोम विन्यास में एक दूसरे के साथ संयोजन के रूप में इन Maven प्लगइन्स का उपयोग करके आप दे देंगे कि तुम क्या जरूरत है। इस समाधान के "सर्वोत्तम प्रथाओं" के रूप में; मुझे यकीन नहीं है।

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <executions> 
    <execution> 
     <id>copy-dependencies</id> 
     <phase>prepare-package</phase> 
     <goals> 
     <goal>copy-dependencies</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${project.build.directory}/lib</outputDirectory> 
     <overWriteReleases>false</overWriteReleases> 
     <overWriteSnapshots>false</overWriteSnapshots> 
     <overWriteIfNewer>true</overWriteIfNewer> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

इस प्रकार Maven-जार-प्लगइन का उपयोग करना::

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>2.3</version> 
    <configuration> 
    <excludes> 
     <exclude>**/*.properties</exclude> 
    </excludes>      
    <archive> 
     <manifest> 
     <addClasspath>true</addClasspath> 
     <classpathPrefix>lib/</classpathPrefix> 
     <mainClass>package.path.to.your.main.class.MainClass</mainClass> 
     </manifest> 
     <manifestEntries> 
     <Class-Path>conf/</Class-Path> 
     </manifestEntries> 
    </archive> 
    </configuration> 
</plugin> 

Maven-संसाधन-प्लगइन का उपयोग

इस प्रकार Maven-निर्भरता-प्लगइन का उपयोग करना के रूप में इस प्रकार है:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.3</version> 
    <executions> 
    <execution> 
     <id>copy-resources</id> 
     <phase>install</phase> 
     <goals> 
     <goal>copy-resources</goal> 
     </goals> 
     <configuration> 
     <outputDirectory>${basedir}/target/conf</outputDirectory> 
     <resources> 
      <resource> 
      <directory>src/main/resources</directory> 
      <includes> 
       <include>**/*.properties</include> 
      </includes> 
      </resource> 
     </resources> 
     </configuration> 
    </execution> 
    </executions> 
</plugin> 

इस परियोजना सेटअप का उपयोग करना, मैं एक config का उपयोग कर ग्रहण में चलाने के लिए, और एक दूसरे पर कदम रख गुण के बिना एक प्रॉपर्टी कॉन्फ़िगर करने के लिए फ़ाइल मेरे उपयोगकर्ताओं, प्रदान कर सकते हैं।

+1

आपके समाधान के लिए धन्यवाद! तुमने मेरा जीवन बचाओ !!! –

+0

मुझे निष्पादन योग्य जार के विचार को उचित ढंग से सेट क्लासपाथ के साथ पसंद है। हो सकता है कि आप [मेवेन असेंबली प्लगइन] (http://maven.apache.org/plugins/maven-assembly-plugin/) भी देख सकें - मैंने इसका इस्तेमाल उसी संरचना के साथ डिलिवरेबल ज़िप बनाने के लिए किया था (अपवाद के साथ, कि मेरा जार निष्पादन योग्य नहीं है .. yet (-;) - ताकि आप संसाधनों और निर्भरता प्लगइन को असेंबली के साथ बदलकर इसे प्राप्त कर सकें ... – Betlista

+0

THIS.IS.A.LIFESAVER। – jmcg

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