【发布时间】:2021-07-21 03:19:18
【问题描述】:
我想传递一个包含案例类的 scala 文件,以便我的应用程序在运行时编译此案例类并开始使用它。
我这样做的主要原因是因为我想避免每次案例类更改时都重新构建我的代码。所以最好将它作为参数传递(如果您想知道,这个案例类的操作是通用的,因此不需要在转换中进行任何返工)
我使用这些post1、post2 和post3 作为参考。到目前为止,我的应用程序如下所示:
import scala.io.Source
import scala.reflect.runtime.universe
import scala.tools.reflect._
object TestCompile {
def main(args: Array[String]): Unit = {
val path = "C:\\myWorkspace\\entity\\TestClass.scala"
val tb = universe.runtimeMirror(getClass.getClassLoader).mkToolBox()
val src = Source.fromFile(path).mkString.stripMargin
val clazz = tb.compile(tb.parse(src))().asInstanceOf[Class[_]]
}
}
TestClass.scala文件是这样的:
case class TestClass(
val value : String,
val timeStamp : Long,
val rowKey : String,
val columnFamily : String
)
但是我遇到了一个例外
val clazz = tb.compile(tb.parse(src))().asInstanceOf[Class[_]]
例外:
线程“主”scala.tools.reflect.ToolBoxError 中的异常: 反射编译失败:由于无法初始化编译器 到 java.lang.VerifyError: scala/工具/反射/ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$api$.liftedTree1$1(ToolBoxFactory.scala:344) 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$api$.compiler$lzycompute(ToolBoxFactory.scala:330) 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$api$.compiler(ToolBoxFactory.scala:329) 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.liftedTree2$1(ToolBoxFactory.scala:356) 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$.apply(ToolBoxFactory.scala:354) 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl.parse(ToolBoxFactory.scala:413) 在 TestCompile$.main(App.scala:17) 在 TestCompile.main(App.scala) 引起:java.lang.VerifyError: scala/工具/反射/ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal 在 scala.tools.reflect.ToolBoxFactory$ToolBoxImpl$withCompilerApi$api$.liftedTree1$1(ToolBoxFactory.scala:334)
以下是我正在使用的依赖项,但是我尝试使用其他版本时总是遇到相同的错误:
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.11.6</version>
</dependency>
我做错了什么?
【问题讨论】:
标签: scala reflection scala-reflect