Я хочу передать файл scala, содержащий класс case, чтобы мое приложение скомпилировало этот класс case во время выполнения и начало его использовать.
Основная причина, по которой я это делаю, заключается в том, что я не хочу перестраивать свой код каждый раз, когда изменяется класс case. Так что было бы лучше передать его как параметр (если вам интересно, операции с этим классом case являются общими, поэтому никаких доработок в преобразованиях не требуется)
Я использовал эти 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[_]]
Исключение:
Исключение в потоке "main" scala.tools.reflect.ToolBoxError: сбой рефлексивной компиляции: невозможно инициализировать компилятор из-за java.lang.VerifyError: scala/tools/reflect/ToolBoxFactory$ToolBoxImpl$ToolBoxGlobal at 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/tools/ Reflect/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>
Что я делаю не так?