我有一个sbt项目,我运行“gen-idea”设置与Intellij 12.4一起使用。在一个项目中是我的主要代码,另一个项目有我的宏代码。通过跟随http://docs.scala-lang.org/overviews/macros/overview.html尝试通过测试文件调试我的宏但是抛出:
error: scala.reflect.internal.MissingRequirementError: object scala.runtime in compiler mirror not found.
at scala.reflect.internal.MissingRequirementError$.signal(MissingRequirementError.scala:16)
at scala.reflect.internal.MissingRequirementError$.notFound(MissingRequirementError.scala:17)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:48)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:40)
at scala.reflect.internal.Mirrors$RootsBase.getModuleOrClass(Mirrors.scala:61)
at scala.reflect.internal.Mirrors$RootsBase.getPackage(Mirrors.scala:172)
at scala.reflect.internal.Mirrors$RootsBase.getRequiredPackage(Mirrors.scala:175)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage$lzycompute(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackage(Definitions.scala:181)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass$lzycompute(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.RuntimePackageClass(Definitions.scala:182)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr$lzycompute(Definitions.scala:1015)
at scala.reflect.internal.Definitions$DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1014)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses$lzycompute(Definitions.scala:1144)
at scala.reflect.internal.Definitions$DefinitionsClass.syntheticCoreClasses(Definitions.scala:1143)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode$lzycompute(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.symbolsNotPresentInBytecode(Definitions.scala:1187)
at scala.reflect.internal.Definitions$DefinitionsClass.init(Definitions.scala:1252)
at scala.tools.nsc.Global$Run.<init>(Global.scala:1290)
at scala.tools.nsc.Driver.doCompile(Driver.scala:32)
at scala.tools.nsc.Main$.doCompile(Main.scala:79)
at scala.tools.nsc.Driver.process(Driver.scala:54)
at scala.tools.nsc.Driver.main(Driver.scala:67)
at scala.tools.nsc.Main.main(Main.scala)
我已经检查过以确保在我的类路径中包含来自SCALA_HOME / lib /的所有jar并且它们都是。顺便说一句,这是Scala v2.10.2
答案 0 :(得分:6)
我只想注意未来的读者,也可以在调试模式下启动你的sbt,然后远程连接想法调试器。
sbt -jvm-debug 5005
5005
)在想法中运行remote-debug配置。这将把它连接到你正在运行的sbt。然后你可以在宏代码中设置断点,当在sbt中运行compile
时,想法应该在断点处停止。
注意:要在成功编译后重新运行compile
,您需要clean
或更改一些代码
答案 1 :(得分:3)
正如我们在#scala中所发现的那样,文档遗漏了一个事实,即需要向调用scalac的JVM命令提供-Dscala.usejavacp=true
参数。之后一切正常,我更新了文档:http://docs.scala-lang.org/overviews/macros/overview.html#debugging_macros。
答案 2 :(得分:2)
有关设置IntelliJ以调试Scala宏的逐步说明:
首先,您需要进行单元测试来锻炼您的宏。假设此单元测试在项目MacroSpec.scala
中为Macro
,并且它包含测试类MacroSpec
。假设您的项目包名为com.example.project
。
“运行/编辑配置...” - 您需要在“应用程序”下添加新配置。将此配置称为“宏调试器”。
在配置上设置各种选项。
scala.tools.nsc.Main
- 这是编译器的主类。 (您将调试运行宏的编译器传递。)-Dscala.usejavacp=true
-cp com.example.project.MacroSpec /home/YourUserName/path/to/your/project/src/test/scala/com/example/project/MacroSpec.scala
您需要根据实际路径和包名称对其进行编辑。/home/YourUserName/path/to/your-project
。您需要对此进行编辑。macro
- 这必须是IntelliJ项目中包含宏代码及其依赖项的模块。在项目的build.sbt
或Build.scala
中,确保macro
模块具有以下依赖关系:"org.scala-lang" % "scala-compiler" % scalaVersion.value % "test"
。在这里,您可能需要检查是否已声明scalaVersion
。 "test"
选项用于避免将scala编译器JAR绑定到最终的应用程序JAR中。
转到宏代码并设置断点。然后运行“宏调试器”。你应该在断点处停下来。