是否有可能使Scala(或从Scala调用的Java)检查资源是否在编译时丢失,如果缺少则抛出编译错误?
我正在与许多开发人员合作开发一个大型Java / Scala混合项目,而我正在提供一个Scala组件,该组件在系统运行结束时就会启动。因此,如果我的组件抛出了缺少的资源运行时错误,那么它才会被发现很晚。我试图确保我的资源在那里,所以这不会发生。但好几次,主管工程师决定改变方向,我的资源改变了路径,我不知道所以没有改变我的代码,然后由于缺少资源,代码在我的组件中死亡。我们正在进行更集中的资源控制,但与此同时,是否有可能使Scala在丢失的资源上抛出编译错误?主要是好奇心,但如果结果很简单就可以实施。
ETA:关于构建工具的问题。这并不简单,因为每个人都在使用自己的环境。有些人正在使用eclipse,有些是netbeans,我正在使用emacs + sbt。因此,即使我插入了sbt检查,对于使用eclipse的其他人也没关系。
答案 0 :(得分:3)
在2.10中,绝对有可能借助宏和字符串插值:
object CheckResource {
import scala.reflect.macros.Context
import scala.language.experimental.macros
implicit class StringResource(sc: StringContext) {
def res(): String = macro __res
}
def __res(c: Context)(): c.Expr[String] = {
import c.universe._
val str = c.prefix.tree match {
case Apply(_, List(Apply(_, List(Literal(Constant(const: String)))))) =>
if (!new java.io.File(const).exists())
c.abort(c.enclosingPosition, s"file '$const' does not exist")
else Literal(Constant(const))
}
c.Expr(str)
}
}
scala> import CheckResource._
import CheckResource._
scala> val file = new java.io.File("test")
file: java.io.File = test
scala> file.createNewFile
res7: Boolean = true
scala> res"test"
res8: String = test
scala> file.delete
res9: Boolean = true
scala> res"test"
<console>:12: error: file 'test' does not exist
res"test"
^
答案 1 :(得分:2)
实际上,您可能可以在Scala 2.10中使用宏执行此操作 - 宏是在编译时运行的一段代码。
这是否是一个明智的事情是完全是另一个问题(仅仅因为它在编译时可用并不一定意味着它将在运行时,反之亦然?)。我建议Richard在你的构建工具中做某事的建议可能更明智。
答案 2 :(得分:0)
不,你不能诱使编译器为你做这个检查。
是的,ant / maven / buildr / sbt可以为你做这个检查。
如果您想了解更多详细信息,请提供有关构建工具的信息。