2011-11-24 10 views
15

クラスパス上のjarファイルスクリプトと同じディレクトリにあります)。これがREPLの場合は:jarを使用できますが、スクリプトモードでは使用できません。スカーラ:私は必要そのようなスクリプトで</p> <pre><code>#!/bin/sh exec scala "

" "[email protected]" !# println("Hello") </code></pre> <p>はに起こる瓶のグループ(からクラスをロードするために:あなたはLinuxのシェルスクリプトとしてScalaのスクリプトを実行することができます

私は-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} 
      ^

は、どのように私はこれらのjarファイルが含まれていますか?

+1

' ''グロブ拡大を防ぐことができます使用して、それは '* .jar' _named_ファイルを探します。 –

答えて

9

働いていませんでした。このような何かをする方法を説明しscripts wikiは、参照してください。私は手ですべてのライブラリに入れて、スクリプト実行中に取得することができた:

#!/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} 

グロブはしかし動作していない理由を私はを知りません。

この場合、スクリプト自体が引数として提供されるため、クラスパスには.がありません。多くの場合、あなたはそれを含める必要がありますけれども:スクリプト(またはフォルダは、それが中にいても、this helpful postに基づいて

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

、私は、libフォルダ内のすべてのjarファイルに引っ張るスクリプトヘッダを持っています)はシンボリックリンクです。

#!/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をオン。
  • 2行目は、スクリプト名を削除し、3行目は、それがあってもよいどこ第四行は、スカラを実行:
  • によって分離されたすべてのjarファイルとcp変数を作成/lib
  • 加算します。
  • 5行目が終了します。これはおそらく必要ではないが、気分が良くなる。
+1

'lib/*。jar'は動作しませんが、 'lib/*' –

+2

シェルのグロブは、ファイル名と一致するときにのみ動作します。 ':'は有効なファイル名文字であるため、これはパスでは機能しません。また、globが一致すると、ファイル名の_space-separated_リストを出力します。 –

+0

コンパイル済みの-saveコンパイル済みオプションを追加すると、スクリプトは最初の実行後に高速に実行されます。 –

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

は、私はあなたがそれを処理する代わりに、SBTを使用することをお勧めし

+2

+1が、含まれていません。 –

+3

いいえ、それは私のためには動作しません。 import文は次のようなエラーメッセージで失敗します: 'error:object jai is package com.sun.media'のメンバではありません。問題のクラスは確かにjarファイルの1つにあります。 –

+0

Hm。知りません。それはちょうど私のために働く。私はいくつかの瓶でチェックしました – viktortnk

4

に動作します。何らかの理由で、グロブ(*.jar)について

#!/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

@MohamedRagab私はそれが仕事のいくつかを節約できると思いますが、わかりません。おそらくあなたが[Nailgun](http://www.martiansoftware.com/nailgun/)で入手できるようなホットなJVMがもっと重要です。 –

+0

@DanielCSobral NailgunはJVMを起動するオーバーヘッドが0.5秒以下であることを理解するのに役立ちます.SBTのキャッシュによって、もう少し時間が節約されます。私が最初にbashスクリプトでJARファイルの存在を確認してから、クラスパスに直接追加しようとすると、ここで行われた処理のいくつかが避けられるならば、素晴らしいでしょう –

0

また、このように、グロブをクラスパスの周りに単一引用符を置くことができます:あなたは(であなたのScala実行ファイルをラップ関数を定義することができ、すべてのヘッダにクラスパスの定義を定義するために避けるために

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

0

例えば)あなたの.bashrcと外側のスコープにvisibileそれを作る:

... 
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 
... 

今、あなたのようにあなたのヘッダーを定義することができます。

#!/bin/bash 
scala "$0" "[email protected]" 
exit 0 
!# 

(あなたはまだ、コマンドラインからREPLタイピング「スカラ」を使用することができます)

関連する問題

 関連する問題