2011-11-24 3 views
15

आप एक linux खोल स्क्रिप्ट के रूप में एक स्केला स्क्रिप्ट चला सकते हैं पर जार लिपि के समान निर्देशिका में रहें)। अगर यह आरईपीएल था तो मैं :jar का उपयोग कर सकता था, लेकिन यह स्क्रिप्ट मोड में उपलब्ध नहीं है।स्काला:</p> <pre><code>#!/bin/sh exec scala "

" "[email protected]" !# println("Hello") </code></pre> <p>एक ऐसी स्क्रिप्ट में मैं की जरूरत है (जार के एक समूह है जो वहां से कक्षाओं लोड करने के लिए: classpath

मैं -classpath पैरामीटर सेट करने के लिए कोशिश कर रहा हूँ:

#!/bin/sh 
exec scala -classpath '.:./*.jar' "$0" "[email protected]" 
!# 

import javax.media.jai.{JAI, RenderedOp} 

लेकिन संकलक सिर्फ कक्षाएं नहीं मिल सकता है:

error: object media is not a member of package javax 
import javax.media.jai.{JAI, RenderedOp} 
      ^

मैं इन जार कैसे शामिल हो?

+1

(आप अभी भी आरईपीएल टाइपिंग कमांड लाइन से 'स्केला' का उपयोग कर सकते) का उपयोग करना 'तो यह _named_' * .jar' किसी फ़ाइल के लिए दिखेगा ', ग्लोब विस्तार नहीं कर पाएगा। –

उत्तर

9

किसी कारण से, ग्लोब (*.jar) काम नहीं कर रहा था। मैं हाथ से सभी पुस्तकालयों में रखकर स्क्रिप्ट का प्रदर्शन शुरू करने में सक्षम था:

#!/bin/sh 
exec scala -cp lib/jai_codec.jar:lib/jai_core.jar:lib/mlibwrapper_jai.jar $0 [email protected] 
!# 

import javax.media.jai.{JAI, RenderedOp} 

मैं नहीं जानता क्यों ग्लोब हालांकि काम नहीं कर रहा।

ध्यान दें कि इस मामले में मेरे पास क्लासपाथ में . नहीं है क्योंकि स्क्रिप्ट स्वयं को तर्क के रूप में प्रदान की जाती है। कई मामलों में आप इसे शामिल करने की आवश्यकता होगी, हालांकि:

exec scala -cp .:lib/jai_codec.jar:lib/jai_core.jar:lib/mlibwrapper_jai.jar $0 [email protected] 

पर this helpful post आधार पर, मैं, एक स्क्रिप्ट हेडर कि एक lib फ़ोल्डर में हर जार में खींचती है, भले ही स्क्रिप्ट (या फ़ोल्डर क्या है) symlinks हैं।

#!/bin/sh 
L=`readlink -f $0` 
L=`dirname $L`/lib 
cp=`echo $L/*.jar|sed 's/ /:/g'` 
/usr/bin/env scala -classpath $cp $0 [email protected] 
exit 
!# 
  • पहली पंक्ति, डिस्क पर अपने वास्तविक स्थान में दिए गए स्क्रिप्ट स्थान $0 बदल जाता है सिमलिंक का विस्तार।
  • दूसरी पंक्ति स्क्रिप्ट नाम दूर करता है और तीसरी पंक्ति सभी जार द्वारा :
  • अलग के साथ एक cp चर बनाता चौथी लाइन, स्केला चलाता है जहाँ भी यह हो सकता है कहते हैं /lib
  • पांचवीं पंक्ति निकलती है। यह शायद जरूरी नहीं है, लेकिन यह मुझे बेहतर महसूस करता है।
+1

'lib/*। Jar' लिखने के लिए एक व्यापक समाधान प्रदान नहीं करता है, लेकिन काम नहीं कर रहा है, लेकिन यह है: 'lib/*' –

+2

शैल ग्लोब केवल तभी काम करते हैं जब वे फ़ाइल नामों से मेल खाते हैं। यह पथ में काम नहीं करेगा क्योंकि ':' एक वैध फ़ाइल नाम चरित्र है। साथ ही, जब ग्लब्स मेल खाते हैं, तो वे फ़ाइल नामों की _space-separ_ सूची आउटपुट करेंगे। –

+0

स्क्रिप्ट को पहली बार तेज़ी से निष्पादित करने के लिए -savecompiled संकलित विकल्प जोड़ें। –

10
exec scala -classpath ./*.jar $0 [email protected] 

काम करेंगे

+2

+1, लेकिन इसमें शामिल नहीं है। –

+3

नहीं, यह मेरे लिए काम नहीं करता है। आयात कथन एक त्रुटि संदेश के साथ विफल रहता है जैसे: 'त्रुटि: ऑब्जेक्ट जय पैकेज commun.media' का सदस्य नहीं है प्रश्न में कक्षा निश्चित रूप से जारों में से एक है, मैंने जांच की है। –

+0

एचएम। मुझे नहीं पता। यह सिर्फ मेरे लिए काम करता है। मैंने कुछ जार – viktortnk

4

मैं आप इसे संभाल करने के बजाय एसबीटी का उपयोग करें। जो बताते हैं कुछ इस तरह कैसे करना है scripts wiki देखें,:

#!/usr/bin/env scalas 
!# 

/*** 
scalaVersion := "2.9.0-1" 

libraryDependencies ++= Seq(
    "net.databinder" %% "dispatch-twitter" % "0.8.3", 
    "net.databinder" %% "dispatch-http" % "0.8.3" 
) 
*/ 

import dispatch.{ json, Http, Request } 
import dispatch.twitter.Search 
import json.{ Js, JsObject } 

def process(param: JsObject) = { 
    val Search.text(txt)  = param 
    val Search.from_user(usr) = param 
    val Search.created_at(time) = param 

    "(" + time + ")" + usr + ": " + txt 
} 

Http.x((Search("#scala") lang "en") ~> (_ map process foreach println)) 
+2

के साथ जांच की है यह काम करता है लेकिन यह बनाता है कि यह सरलतम स्क्रिप्ट को लगभग 8 सेकंड तक ले जाता है, हर बार, इसके आसपास के किसी भी तरह से इसे आगे बढ़ाने के लिए भी तेज बनाता है? –

+0

@ मोहम्मद रागग मुझे लगता है कि यह कुछ कामों पर बचा सकता है, लेकिन मुझे यकीन नहीं है। एक गर्म जेवीएम शायद अधिक महत्वपूर्ण है, जैसे कि आप [नेलगुन] (http://www.martiansoftware.com/nailgun/) के साथ प्राप्त कर सकते हैं। –

+0

@DanielCSobral यकीन है कि Nailgun मदद करेगा, मेरी समझ के लिए JVM शुरू करने के ऊपरी हिस्से में आधे सेकेंड से नीचे है, और एसबीटी कैशिंग निश्चित रूप से थोड़ा और समय बचाता है। अगर यह आवश्यक नहीं है तो यहां कुछ प्रसंस्करण से बचा जाना अच्छा होगा, मैं बैश स्क्रिप्ट में पहली बार आईवी कैश में जेएआर फाइलों के अस्तित्व की जांच करने के प्रयास के साथ खेल रहा हूं और फिर उन्हें क्लासपाथ में सीधे –

0

तुम भी एक ग्लोब के साथ classpath के आसपास एकल उद्धरण डाल सकता है, इस तरह:

exec scala -classpath '.:*.jar' "$0" "[email protected]"

0

हर शीर्षक में classpath परिभाषा को परिभाषित करने के आप एक समारोह है कि में अपने स्केला निष्पादन लपेटता परिभाषित कर सकते हैं से बचने के लिए (

0123:

... 
function scala() { 

    PARAMS=("[email protected]") 

    FILENAME=${PARAMS[0]} 
    REMAINING_PARAMS=(${PARAMS[@]:1:${#PARAMS[@]}}) 

    CUSTOM_CLASSPATH_DEF=".:/whatever/*" 
    /path/to/scala -cp "$CUSTOM_CLASSPATH_DEF" -Dscala.color=true "$FILENAME" "${REMAINING_PARAMS[@]}" 
} 

export -f scala 
... 

अब आप के रूप में अपने शीर्ष लेख को परिभाषित कर सकते हैं: उदाहरण के लिए) अपने .bashrc और यह दृश्यमान बाहरी गुंजाइश के लिए बनाने के

`

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