2014-08-28 7 views
5

मैं अपने आवेदन के लिए एक प्रारंभ स्क्रिप्ट उत्पन्न करने के लिए sbt-native-packager प्लगइन का उपयोग कर रहा हूं, जो बहुत सुविधाजनक है क्योंकि यह प्लगइन मेरी सभी लाइब्रेरी निर्भरताओं के साथ सही क्लासपाथ विनिर्देश उत्पन्न करता है। मैं इस applictaion वितरित नहीं कर रहा हूँ, इसलिए मैं पूरी चीज एक टैरबॉल में पैकेजिंग नहीं कर रहा हूँ। मैं बस sbt-native-packager द्वारा उत्पन्न lib निर्देशिका का उपयोग करता हूं जिसमें सभी जार-फाइलें शामिल हैं जिन पर मेरा प्रोजेक्ट निर्भर करता है, दोनों तृतीय-पक्ष पुस्तकालयों के साथ-साथ जार-फ़ाइल जिसमें मेरी अपनी कक्षा और संसाधन फ़ाइलें शामिल हैं।sbt-native-packager को अपने संसाधनों को जार फ़ाइल में डालने से कैसे रोकें?

मेरी प्रोजेक्ट की src/main/resources निर्देशिका में मेरे पास ऐसी फ़ाइलें हैं जिन्हें मैं संपूर्ण स्थापना को पुन: उत्पन्न करने के लिए sbt-native-packager का उपयोग किए बिना संपादित करने में सक्षम होना चाहता हूं, उदाहरण के लिए कॉन्फ़िगरेशन फ़ाइलें। यह मुश्किल है क्योंकि उन फ़ाइलों को मेरी सभी कक्षाओं के साथ जार फ़ाइल में ज़िपित किया जाता है।

प्रश्न: मैं sbt-native-packager को कैसे कह सकता हूं कि मेरी संसाधन फ़ाइलों को एक जार-फ़ाइल में न डालें, जबकि अभी भी उन संसाधन फ़ाइलों के लिए सही क्लासपाथ के साथ स्टार्ट-स्क्रिप्ट उत्पन्न करना और मेरे आवेदन द्वारा पढ़ना क्योंकि वे अब जार फ़ाइल के भीतर से हैं? यदि इसका मतलब है कि मेरी सभी क्लास फाइलों को जार फ़ाइल से बाहर करना ठीक है, तब तक जब तक src/main/resources की फाइलें ऐसी फाइलों के रूप में रहेंगी जिन्हें मैं sbt stage को पुन: आमंत्रित किए बिना बदल सकता हूं और जब तक स्टार्ट-स्क्रिप्ट काम करता है।

+0

मुझे विश्वास है कि आप एसबीटी-स्टार्ट-स्क्रिप्ट का डिफ़ॉल्ट व्यवहार प्राप्त कर रहे हैं https://github.com/sbt/sbt-start-script#about-this-plugin-sbt-start-script –

+2

@ झोनी एवरसन यह हो सकता है, लेकिन यह उस परियोजना के लिए 'रीडमे' था जिसने मुझे एसबीटी-देशी-पैकर का नेतृत्व किया। पहली बात यह है कि (एक बहुत बड़ी शीर्षक के तहत) यह है कि इसे एसबीटी-नेटिव-पैकर द्वारा प्रतिस्थापित किया जा सकता है, जो इसे ध्वनि बनाता है जैसे डेवलपर इसे बनाए रखने से रोकने के लिए अब इसे अपनाने का बुरा विचार है। यह एसबीटी-नेटिव-पैकर को "अधिक सामान्य" के रूप में भी वर्णित करता है, जो बताता है कि प्लगइन जो कुछ भी कर सकता है, एसबीटी-नेटिव-पैकर भी कर सकता है। –

उत्तर

1

हालांकि इन संसाधनों को फ़िल्टर करना संभव है, लेकिन मैं उन्हें एक अलग निर्देशिका में रखने और उन्हें कक्षापथ में जोड़ने का सुझाव दूंगा।

एसबीटी-नेटिव-पैकर द्वारा उत्पन्न स्टार्ट स्क्रिप्ट को संशोधित करना कक्षा com.typesafe.sbt.packager.archetypes.JavaAppBashScript के रूप में थोड़ा बोझिल है जो क्लासपाथ उत्पन्न कर रहा है $lib_dir/ के साथ सभी पथों को उपसर्ग कर रहा है। सबसे साफ दृष्टिकोण शायद अपना खुद का कार्यान्वयन प्रदान करेगा और bashScriptDefines उत्पन्न करने के लिए इसका उपयोग करेगा।

एक सरल लेकिन hacky रास्ता सिर्फ अपने build.sbt को निम्नलिखित लाइनों को जोड़ने के लिए होगा:

packageArchetype.java_server 

// add your config files to the classpath for running inside sbt 
unmanagedClasspath in Compile += Attributed.blank(sourceDirectory.value/"main"/"config") 

// map all files in src/main/config to config in the packaged app 
mappings in Universal ++= { 
    val configDir = sourceDirectory.value/"main"/"config" 
    for { 
    file <- (configDir ** AllPassFilter).get 
    relative <- file.relativeTo(configDir.getParentFile) 
    mapping = file -> relative.getPath 
    } yield mapping 
} 

scriptClasspath ~= (cp => "../config" +: cp) 

यह आपके प्रारंभ स्क्रिप्ट के classpath को $lib_dir/../config पहले जोड़ें होगा। यदि आपके ऐप को विंडोज़ पर चलाना है तो आपको batScriptDefines के लिए समान सेटिंग्स प्रदान करनी होंगी।

+0

सुझावों के लिए धन्यवाद; मैं उन्हें कोशिश करूँगा। प्रश्न: क्या मेरी फाइलों (कॉन्फ़िगरेशन/संसाधन और बाइटकोड/कक्षा) को जार में ज़िपित करने से रोकने के लिए कोई तरीका है? तब क्लासपाथ वही रहेगा और मैं स्टार्ट-स्क्रिप्ट को छोड़ सकता हूं? –

+0

असल में इसका मतलब यह होगा कि क्लासपाथ बदलता है (पैक किए गए ऐप में) क्योंकि कक्षाएं एक अलग स्थान पर निर्देशिका में समाप्त हो जाएंगी। एक अन्य विकल्प उदाहरण के लिए एक सिस्टम संपत्ति जोड़ना होगा सेटिंग 'bashScriptExtraDefines + = "" "addJava -Dmy.config.dir =" $ (realpath "$ {app_home} /../ config") "" "" और इसे अपने प्रोग्राम में पढ़ें लेकिन उसे कुछ अतिरिक्त काम की आवश्यकता होगी 'run' कमांड को उस के साथ अच्छी तरह से काम करने के लिए। – Moritz

+0

"इसका मतलब यह होगा कि क्लासपाथ बदलता है (पैक किए गए ऐप में) क्योंकि कक्षाएं एक अलग स्थान पर निर्देशिका में समाप्त हो जाएंगी।" मुझे यह जानने में रुचि होगी कि यह कैसे करें: मेरी सभी फाइलें (कॉन्फ़िगरेशन प्लस क्लास फाइल) को किसी भी जार फ़ाइल से बाहर छोड़ दें। –

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