从shell脚本运行scala脚本

时间:2017-01-19 10:41:55

标签: scala shell classpath

我有一个包含Scala类/对象和脚本的Scala项目。我试图从命令行运行脚本(使用类/对象执行各种操作)。我希望这样做的方法是创建一个shell,它将作为参数传递脚本的名称,以及脚本本身所采用的参数。

我的文件夹结构如下:

runner.sh -> script I am trying to implement to run the Scala scripts
bin/ -> script I am trying to implement to run the Scala scripts
lib/ -> -> rest of scala project, packed as multiple jars 

我目前正在shell脚本中创建一个变量LIB_CLASSPATH,其中包含lib/文件夹的内容,我正在尝试按如下方式运行我的脚本:

java -cp $LIB_CLASSPATH ./bin/<name_of_script.scala> <parameters of the script>

我总是得到同样的错误:

Could not find or load main class: ..lib/<name of jar> 
-- <name of jar> is actually the first jar in the lib/ folder

我可以使用一些指导:)

感谢

3 个答案:

答案 0 :(得分:1)

您可以使用Ammonite(由@lihaoyi撰写)。

它是更好的Scala REPL,Shell,OPs库和 Script runner 的组合。 请参阅此处的文档 - http://www.lihaoyi.com/Ammonite/

10分钟的谈话,展示如何更好地编写脚本和shell - https://www.youtube.com/watch?v=wk2-ZsQU358

我认为这也是一个很好的起点。我的谈话是:)

答案 1 :(得分:0)

我建议使用sbt native packager。参见:

https://github.com/sbt/sbt-native-packager

您将此行添加到build.sbt:

mainClass in Compile := Some("org.shapelogic.sc.javafx.ViewGui")

定义一个主类:

sbt stage

运行:

target/universal/stage/bin/shapelogic

它创建位于以下位置的启动脚本:

target/universal/stage/bin/shapelogic -- -i image/440px-Lenna.png 

以下是我如何使用该脚本的示例:

target/universal/stage/bin/shapelogic -main "org.shapelogic.sc.script.Threshold" -- i image/440px-Lenna.png 

如果你想运行另一个课程,你可以这样做:

function myfunc(){
$.ajax({
url:"comments.php",
data:$("input").val(),
method:'post',
success:function(response){
},
error:function(error,message){
}
});

}

<form action="javascript:myfunc()"......>

答案 2 :(得分:0)

这是一个能够做你想做的事情的脚本。它基于我使用的脚本,但为了清晰起见而被删除:

#!/bin/bash

# copies of or symlinks to all required jar files
# must be in one of the directories referenced by CP

if [ $# -eq 0 ]; then
  echo "usage: ${0##*} <scala-script-path>" 1>&2
  exit 1
fi

REQUIRED_JAR_DIRECTORIES=(
"/usr/local/olib/*"
"/usr/local/jlib/*"
)
CP=$(echo "${REQUIRED_JAR_DIRECTORIES[@]}" | tr ' ' ':')
case `uname` in
CYGWIN*)
  CP=`cygpath -p -w "$CP"`
  ;;
esac
scala -deprecation -feature -classpath "$CP" "$@"

使用此脚本的最简单方法是将其放在PATH中,然后将以下hash-bang行添加到scala脚本的顶部。假设您调用此脚本&#39; scalaRunner&#39;,这里是一个独立的工作scala脚本:

#!/usr/bin/env scalaRunner

println("Hello World!")

这是一个稍微复杂一点的人:

#!/usr/bin/env scalaRunner

if( args.isEmpty ){
  printf("usage: <arg1> [<arg2> ..]\n")
  sys.exit(1)
}
for( (arg,i) <- args.zipWithIndex ){
  printf("arg %d: %s\n",i,arg)
}

如果您导入任何东西,只需确保所有必需的罐子都在REQUIRED_JAR_DIRECTORIES中。

实际上,您可能需要比此脚本更灵活的内容,尤其是在指定所需的jar所在位置时。