【问题标题】:Running a Scala Script with external dependencies运行具有外部依赖项的 Scala 脚本
【发布时间】:2011-09-15 02:31:15
【问题描述】:

我在 /Users/joe/.scala/lib 下有以下 jar:

commons-codec-1.4.jar       
httpclient-4.1.1.jar        
httpcore-4.1.jar
commons-logging-1.1.1.jar   
httpclient-cache-4.1.1.jar  
httpmime-4.1.1.jar

下面是我用 scala 编写的 test.sh。

#!/bin/sh -v
L=`cd /Users/joe/.scala/lib;pwd`
cp=`echo $L/*.jar|sed 's/ /:/g'`
echo $cp
exec scala -classpath $cp $0 $@
!#
println(new org.apache.commons.httpclient.HttpClient())

这是我得到的错误:

$ ./test.sh 
#!/bin/sh -v
L=`cd /Users/joe/.scala/lib;pwd`
cd /Users/joe/.scala/lib;pwd
cp=`echo $L/*.jar|sed 's/ /:/g'`
echo $L/*.jar|sed 's/ /:/g'
echo $cp
/Users/joe/.scala/lib/commons-codec-1.4.jar:/Users/joe/.scala/lib/commons-logging-1.1.1.jar:/Users/joe/.scala/lib/httpclient-4.1.1.jar:/Users/joe/.scala/lib/httpclient-cache-4.1.1.jar:/Users/joe/.scala/lib/httpcore-4.1.jar:/Users/joe/.scala/lib/httpmime-4.1.1.jar
exec scala -classpath $cp $0 $@
/Users/joe/Desktop/scala/./test.sh:7: error: object httpclient is not a member of package org.apache.commons
println(new org.apache.commons.httpclient.HttpClient())
                               ^
one error found

然而,没有任何类路径依赖的简单方法可以工作: 你好.sh

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

println(new java.util.Date())

知道我在第一个示例中做错了什么吗?或者,在使用 scala 脚本时设置类路径依赖项的最佳方法是什么?

【问题讨论】:

  • 有没有可能因为你的jar不包含org.apache.commons.httpclient这个简单的原因,这个错误是正确的?
  • @Langali:为什么你的问题被“测试测试测试测试”取代了?别了。

标签: java bash scala scripting jvm


【解决方案1】:

我不会回答你的问题,但你可能对此感兴趣。

假设您下载并安装SBT(0.10.0 或更高版本),并创建一个名为“scalas”的 shell 脚本:

java -Dsbt.main.class=sbt.ScriptMain \
     -Dsbt.boot.directory=/home/user/.sbt/boot \
     -jar sbt-launch.jar "$@"

然后你这样写你的脚本:

#!/usr/bin/env scalas
!#

/***
scalaVersion := "2.9.1"

libraryDependencies ++= Seq(
  "commons-codec" % "commons-codec" % "1.4", 
  "org.apache.httpcomponents" % "httpclient" % "4.1.1",
  "org.apache.httpcomponents" % "httpcore" % "4.1",
  "commons-logging" % "commons-logging" % "1.1.1",
  "org.apache.httpcomponents" % "httpclient-cache" % "4.1.1", 
  "org.apache.httpcomponents" % "httpmime" % "4.1.1"
)
*/

println(new org.apache.http.client.DefaultHttpClient())

【讨论】:

    【解决方案2】:

    我认为 4.1.1 的类是 org.apache.http.client.HttpClient 而不是 org.apache.commons.httpclient,它是一个接口。所以你可能想要

    new org.apache.http.client.DefaultHttpClient()
    

    而不是

    new org.apache.commons.httpclient.HttpClient()
    

    在早期版本中可能会有所不同。

    【讨论】:

    • @Langali:我们都去过那里。
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-29
    • 2016-03-08
    相关资源
    最近更新 更多