2010-11-08 16 views
14

मैं एक गुण फ़ाइल लोड करने के लिए मेरे कार्यक्रम में इस कोड का उपयोग:निष्पादन जार गुण नहीं मिलेगा फ़ाइलें

Properties properties = new Properties(); 
URL url = new App().getClass().getResource(PROPERTIES_FILE); 
properties.load(url.openStream()); 

कोड ग्रहण में ठीक चलाता है। फिर मैं प्रोग्राम को MyProgram.jar नामक एक जेएआर में पैकेज करता हूं, और इसे चलाता हूं, मुझे दूसरी पंक्ति में एक नलपोइंटर एक्सेप्शन मिला। JAR में गुण फ़ाइल नहीं है, वे दोनों एक ही निर्देशिका में हैं। मैं जार बनाने के लिए मेवेन का उपयोग कर रहा हूं। मैं इस समस्या को कैसे ठीक करुं?

अद्यतन: मैं गुण फ़ाइल को JAR में जोड़ना नहीं चाहता, क्योंकि यह तैनाती के समय पर बनाया जाएगा।

+2

साइड नोट: वहाँ किसी भी कारण से आप उपयोग कर रहे 'getResource है()' 'getResourceAsStream()' के बजाय, क्योंकि आप इसे अभी भी स्ट्रीम के रूप में उपयोग कर रहे हैं? – Powerlord

+1

नहीं, मेरे पास कोई विशेष कारण नहीं है। –

+0

आप अपने जार कैसे चलाते हैं? यदि जावा -जर के माध्यम से, क्या आप जावा-सीपी ./MyProgram.jar आज़मा सकते हैं और देख सकते हैं कि यह काम करता है या नहीं? –

उत्तर

23

बलुससी सही है, आपको Class-Path: प्रविष्टि में वर्तमान निर्देशिका (.) के साथ MANIFEST.MF उत्पन्न करने के लिए मेवेन को निर्देश देने की आवश्यकता है।

मान लिया जाये कि आप अभी भी Maven विधानसभा प्लगइन और jar-with-dependencies वर्णनकर्ता का उपयोग कर रहे अपने निष्पादन योग्य जार के निर्माण के लिए, यदि आप ऐसा उपयोग करते हुए निम्न करने के लिए प्लगइन बता सकते हैं:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2</version> 
    <configuration> 
     <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
     </descriptorRefs> 
     <archive> 
     <manifest> 
      <mainClass>com.stackoverflow.App</mainClass> 
     </manifest> 
     <manifestEntries> 
      <Class-Path>.</Class-Path> <!-- HERE IS THE IMPORTANT BIT --> 
     </manifestEntries> 
     </archive> 
    </configuration> 
    <executions> 
     <execution> 
     <id>make-assembly</id> <!-- this is used for inheritance merges --> 
     <phase>package</phase> <!-- append to the packaging phase. --> 
     <goals> 
      <goal>single</goal> <!-- goals == mojos --> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 
+0

कैश करता है यदि आप मेवेन असेंबली प्लगइन का उपयोग नहीं कर रहे हैं, तो मुझे बताएं और मैं अपना उत्तर अपडेट करूंगा। –

+0

'निष्पादन' अनुभाग के साथ, मुझे 'एमवीएन असेंबली: असेंबली' को अलग से चलाने की ज़रूरत नहीं है? वैसे, मेवेन पर मेरे सभी सवालों के जवाब देने के लिए धन्यवाद। –

+1

@ हैइंहिन्हनगुएन: वास्तव में, उपरोक्त 'निष्पादन' 'पैकेज' चरण पर 'एकल' लक्ष्य को बांधता है। नतीजतन, 'एमवीएन पैकेज' चलाना असेंबली बनाता है। ओह, और आपका स्वागत है। –

2

संपादित करें:

आप यह सुनिश्चित करें कि गुण फ़ाइल जावा मंगलाचरण कि जार फ़ाइल सितारों के लिए सही जड़ के साथ वर्ग के रास्ते पर है बनाने की जरूरत है: यह आपकी टिप्पणी का जवाब है। यदि आपका पथ

सामान/things.properties

है और रनटाइम स्थान

/opt/myapp/etc/stuff/things.properties

है और जार फ़ाइल

में है

/opt/MyApp/bin/myjar

तो आप

के रूप में शुरू करने की जरूरत है

/पथ/से/जावा-सीपी "/opt/myapp/etc:/opt/myapp/bin/myjar.jar" my.pkg.KavaMain

इस तरह की कॉन्फ़िगरेशन के साथ काम करने से देव में परेशानी हो सकती है पर्यावरण, सौभाग्य से, maven exec plugin है जो आपको सही प्रकार का लॉन्च परिदृश्य प्राप्त करेगा।

मूल उत्तर:

आप the maven resources plugin के बारे में पढ़ना चाहते हैं।

मूल रूप से आप कुछ इस तरह जोड़ना चाहते हैं:

<plugin> 
     <artifactId>maven-jar-plugin</artifactId> 
     <configuration> 
       <resources> 
         <resource> 
           <directory>src/main/java</directory> 
           <includes> 
             <include>**/*properties</include> 
           </includes> 
         </resource> 
       </resources> 
     </configuration> 
<plugin> 

अपने pom.xml करने के लिए यह सोचते हैं आप कर रहे हैं कि propertis फ़ाइल अपने जावा स्रोतों के साथ है - वास्तव में यह src/मुख्य/संसाधनों में होना चाहिए।

+0

धन्यवाद, लेकिन मैं गुण फ़ाइल को जार में जोड़ना नहीं चाहता हूं। इसे तैनाती के समय में बदला जाएगा। –

+0

आपके संपादन के अनुसार: '-pp' तर्क का उपयोग करते समय' -cp' तर्क ** अनदेखा ** है। यह वास्तव में 'MANIFEST.MF' फ़ाइल में जाना है :) – BalusC

+0

@ बालुससी दाएं, निश्चित करें। MANIFEST.MF में नहीं जा सकता अगर यह रनटाइम पर जा सकता है। – lscoughlin

17

workarounds दो होते हैं:

  1. executabele जार के रूप में जार का उपयोग न करें, लेकिन पुस्तकालय के रूप में।

    java -cp .;filename.jar com.example.YourClassWithMain 
    
  2. JAR फ़ाइल के मूल स्थान प्राप्त और गुण से फाइल मिलता है। दोनों की

    URL root = getClass().getProtectionDomain().getCodeSource().getLocation(); 
    URL propertiesFile = new URL(root, "filename.properties"); 
    Properties properties = new Properties(); 
    properties.load(propertiesFile.openStream()); 
    

कोई भी दृष्टिकोण सिफारिश कर रहे हैं!

Class-Path: . 

तो यह classpath संसाधन हमेशा की तरह के रूप में उपलब्ध हो जाएगा: की सिफारिश दृष्टिकोण जार के /META-INF/MANIFEST.MF फ़ाइल में निम्न प्रविष्टि है। आपको वास्तव में MANIFEST.MF फ़ाइल उत्पन्न करने के लिए मेवेन को किसी भी तरह निर्देशित करना होगा।

+0

ओह मैंने पहले पहले विकल्प की कोशिश की लेकिन मैंने उपयोग किया। COMMA filename.jar। शायद यही कारण है कि यह काम नहीं किया। आपकी सहायता के लिए धन्यवाद. –

+0

क्लासपाथ से बचने का एक कारण है - अर्थात् यदि सामग्री पढ़ने के बीच बदलती है। संसाधन लोडर पहली सामग्री –

0

मैं एक ऐसी ही समस्या थी, और यह धागा एक बड़ी मदद थी! FYI करें, मैं MANIFEST बनाने करने के लिए मेरी चींटी buildfile संशोधित, तो वह प्रकट नामित जब जार-इंग मेरी सर्वर-साइड कोड:

<!-- Create a custom MANIFEST.MF file, setting the classpath. --> 
<delete file="${project.base.dir}/resources/MANIFEST.MF" failonerror="false"/> 
<manifest file="${project.base.dir}/resources/MANIFEST.MF"> 
    <attribute name="Class-Path" value="." /> 
</manifest> 

<!-- JAR the server-side code, using the custom manifest from above. --> 
<jar destfile="services/${name}.aar" manifest="${project.base.dir}/resources/MANIFEST.MF"> 
[....] 
संबंधित मुद्दे