Scala作为shell脚本:类路径上的jar

Mar*_*ing 17 scala jar

您可以将scala脚本作为linux shell脚本运行:

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

println("Hello")
Run Code Online (Sandbox Code Playgroud)

在一个这样的脚本中,我需要从一组jar中加载类(这些jar恰好与脚本位于同一目录中).如果这是我可以使用的REPL :jar,但这在脚本模式下不可用.

我正在尝试设置-classpath参数:

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

import javax.media.jai.{JAI, RenderedOp}
Run Code Online (Sandbox Code Playgroud)

但编译器只是找不到类:

error: object media is not a member of package javax
import javax.media.jai.{JAI, RenderedOp}
             ^
Run Code Online (Sandbox Code Playgroud)

我如何包括这些罐子?

vik*_*tnk 10

exec scala -classpath ./*.jar $0 $@
Run Code Online (Sandbox Code Playgroud)

将工作

  • 不,它对我不起作用.import语句失败并显示错误消息,例如:`error:object jai不是com.sun.media包的成员.有问题的类肯定在其中一个jar中,我检查过. (3认同)

Mar*_*ing 10

由于某种原因,glob(*.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}
Run Code Online (Sandbox Code Playgroud)

我不知道为什么 glob不起作用.

请注意,在这种情况下,我没有.在类路径中,因为脚本本身作为参数提供.在许多情况下,您需要包含它:

exec scala -cp .:lib/jai_codec.jar:lib/jai_core.jar:lib/mlibwrapper_jai.jar $0 $@
Run Code Online (Sandbox Code Playgroud)

基于这篇有用的帖子,我有一个脚本标题,可以拉入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 $@
exit
!#
Run Code Online (Sandbox Code Playgroud)
  • 第一行将给定的脚本位置$0转换为其在磁盘上的实际位置,从而扩展符号链接.
  • 第二行删除脚本名称并添加 /lib
  • 第三行创建一个cp变量,所有的jar分隔开:
  • 第四行运行scala,无论它在哪里.
  • 第五行退出.这可能不是必要的,但它让我感觉更好.

  • lib / *。jar不起作用,但这是:lib / * (2认同)
  • Shell globs仅在匹配文件名时才起作用.这在路径中不起作用,因为':'是有效的文件名字符.此外,当globs匹配时,它们将输出_space-separated_文件名列表. (2认同)