Scala как скрипт оболочки: баночки на пути к классам - PullRequest
16 голосов
/ 24 ноября 2011

Вы можете запустить скрипт scala как скрипт оболочки linux:

#!/bin/sh
exec scala "$0" "$@"
!#

println("Hello")

В одном таком скрипте мне нужно загрузить классы из группы jar-файлов (которые находятся в том же каталоге, что и скрипт). Если бы это был REPL, я мог бы использовать :jar, но это не доступно в режиме сценария.

Я пытаюсь установить параметр -classpath:

#!/bin/sh
exec scala -classpath '.:./*.jar' "$0" "$@"
!#

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

но компилятор просто не может найти классы:

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

Как мне включить эти банки?

Ответы [ 6 ]

10 голосов
/ 24 ноября 2011
exec scala -classpath ./*.jar $0 $@

будет работать

9 голосов
/ 28 ноября 2011

По какой-то причине шар (*.jar) не работал.Я смог запустить скрипт, вставив вручную все библиотеки:

#!/bin/sh
exec scala -cp lib/jai_codec.jar:lib/jai_core.jar:lib/mlibwrapper_jai.jar $0 $@
!#

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

Я не знаю , почему , хотя глобус не работает.

Обратите внимание, что в этом случае у меня нет . в пути к классам, потому что сам скрипт предоставляется в качестве аргумента.Во многих случаях, хотя вам нужно будет включить его:

exec scala -cp .:lib/jai_codec.jar:lib/jai_core.jar:lib/mlibwrapper_jai.jar $0 $@

На основании этого полезного поста , у меня есть заголовок сценария, который вытягивает каждую банку в libпапка, даже если сценарий (или папка, в которой он находится) являются символическими ссылками.

#!/bin/sh
L=`readlink -f $0`
L=`dirname $L`/lib
cp=`echo $L/*.jar|sed 's/ /:/g'`
/usr/bin/env scala -classpath $cp $0 $@
exit
!#
  • Первая строка превращает указанное местоположение сценария $0 в его фактическое местоположение на диске, расширяя символические ссылки.
  • Во второй строке удаляется имя скрипта и добавляется /lib
  • В третьей строке создается переменная cp со всеми банками, разделенными :
  • Четвертая строказапускает scala, где бы он ни находился.
  • Пятая строка выходит.Вероятно, в этом нет необходимости, но я чувствую себя лучше.
4 голосов
/ 25 ноября 2011

Я рекомендую вместо этого использовать SBT. Смотрите 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))
1 голос
/ 26 июня 2012

http://www.scalaclass.com/node/10 Это должно работать для вас.Я просто исправляю зависимость в соответствии с этим.

0 голосов
/ 29 января 2016

Чтобы не определять определение classpath в каждом заголовке, вы можете определить функцию, которая оборачивает ваш исполняемый файл scala в (например) ваш .bashrc и делает его видимым для внешней области видимости:

...
function scala() {

    PARAMS=( "$@" )

    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" "$@"
exit 0
!#

(Вы все еще можете использовать REPL, набрав 'scala' из командной строки)

0 голосов
/ 25 марта 2015

Вы также можете поместить одинарные кавычки вокруг пути к классу с помощью шарика, например:

exec scala -classpath '.:*.jar' "$0" "$@"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...