当我有一个scala程序作为从包中提取的shell脚本时,如果我修改了该包,那么即使我重新编译,shell脚本也看不到这些更改。
这是一个非常简单的例子:
one.scala
:
package myPackage
object one {
val value = "one"
}
main.scala
:
import myPackage._
object Main extends App {
println( one.value )
}
现在,如果我按如下方式运行它,一切都按预期运行:
$ scalac one.scala main.scala
$ scala Main
one
现在我将main.scala
转换为shell脚本
#/usr/bin/env scala
import myPackage._
println( one.value )
并执行它
$ chmod 755 main.scala
$ ./main.scala
one
一切都很好,直到我修改包并尝试引用它
two.scala
:
package myPackage
object two {
val value = "two"
}
并修改我的主要参考它:
#/usr/bin/env scala
import myPackage._
println( one.value )
println( two.value )
现在编译并运行它并收到一条奇怪的错误消息:
$ scalac one.scala two.scala
$ ./main.scala
.../main.scala:4: error: not found: value two
println( two.value )
^
但它就在那里。它只是因为某种原因没有把它拿起来。所以让我们尝试改变主要的回归......
//#!/usr/bin/env scala
import myPackage._
object Main extends App {
println( one.value )
println( two.value )
}
编译并运行
$ scalac one.scala two.scala main.scala
$ scala Main
one
two
现在将其转换回在shebang
下运行#!/usr/bin/env scala
import myPackage._
//object Main extends App {
println( one.value )
println( two.value )
//}
运行它:
$ scalac one.scala two.scala
$ ./main.scala
.../main.scala:4: error: not found: value two
println( two.value )
^
说什么?!这里发生了什么?我该如何解决?
我用CLASSPATH =和=“尝试过它。”和= pwd
我尝试修改shebang:
#!/bin/sh
exec scala -cp . "$0" "$@"
!#
它运行:
$ ./main.scala
one
two
非常有趣。所以它接受了改变。现在让我们再次更改包
one.scala
package myPackage
object one {
val value = "one"
val and = "and
}
main.scala
#!/bin/sh
exec scala -cp . "$0" "$@"
!#
import myPackage._
//object Main extends App {
println( one.value )
println( one.and )
println( two.value )
//}
有效地再次表现出错误:
./main.scala:8: error: value and is not a member of object myPackage.one
println( one.and )
^
所以,改回shebang。没有骰子。尝试不同的shebang。没有帮助。但是,如果我将它作为一个类运行,它就可以工作。
其他人可以重现这个吗?关于这里发生了什么的任何想法?
$ uname -a
Darwin <hostname> 12.5.0 Darwin Kernel Version 12.5.0: Sun Sep 29 13:33:47 PDT 2013; root:xnu-2050.48.12~1/RELEASE_X86_64 x86_64
$ scala -version
Scala code runner version 2.11.1 -- Copyright 2002-2013, LAMP/EPFL
答案 0 :(得分:0)
使用scala -nc
来避免运行编译守护程序。
这可能是重复的。
如果我错了,因为; tldr综合症。