我正在尝试运行一个打包为JAR(包括依赖项)的Scala应用程序,但是这个失败直到使用 -Xbootclasspath/p
选项。
调用失败:
java -jar /path/to/target/scala-2.10/application-assembly-1.0.jar
在应用程序执行了一些预期输出后,控制台显示:
线程“main”中的异常 scala.reflect.internal.MissingRequirementError:object scala.runtime 在编译器镜像中找不到。 在scala.reflect.internal.MissingRequirementError $ .signal(MissingRequirementError.scala:16) 在scala.reflect.internal.MissingRequirementError $ .notFound(MissingRequirementError.scala:17) 在scala.reflect.internal.Mirrors $ RootsBase.getModuleOrClass(Mirrors.scala:48) 在scala.reflect.internal.Mirrors $ RootsBase.getModuleOrClass(Mirrors.scala:40) 在scala.reflect.internal.Mirrors $ RootsBase.getModuleOrClass(Mirrors.scala:61) 在scala.reflect.internal.Mirrors $ RootsBase.getPackage(Mirrors.scala:172) 在scala.reflect.internal.Mirrors $ RootsBase.getRequiredPackage(Mirrors.scala:175) at scala.reflect.internal.Definitions $ DefinitionsClass.RuntimePackage $ lzycompute(Definitions.scala:181) 在scala.reflect.internal.Definitions $ DefinitionsClass.RuntimePackage(Definitions.scala:181) at scala.reflect.internal.Definitions $ DefinitionsClass.RuntimePackageClass $ lzycompute(Definitions.scala:182) 在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) 在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) 在scala.reflect.internal.Definitions $ DefinitionsClass.init(Definitions.scala:1252) 在scala.tools.nsc.Global $ Run。(Global.scala:1290) 在extract.ScalaExtractor $ Compiler $ 2 $。(ScalaExtractor.scala:24)
工作调用:
java -Xbootclasspath/p:/path/to/home/.sbt/boot/scala-2.10.2/lib/scala-library.jar -jar /path/to/target/scala-2.10/application-assembly-1.0.jar
关于它的奇怪之处在于 application-assembly-1.0.jar
构建,以便它包括所有依赖项,包括Scala库。当一个人提取JAR文件时,可以验证该文件中的类文件 scala.runtime
包已包括在内。
创建JAR文件
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.9.1")
被添加到 project/plugins.sbt
和 assembly
调用了目标。一个约25MB结果的JAR文件。
使用proguard构建JAR显示与程序集的JAR文件相同的运行时行为。
触发MissingRequirementError的应用程序代码
一些应用程序代码工作正常,并且一旦触发了先前描述的异常 new Run
从以下片段执行。
import scala.reflect.internal.util.BatchSourceFile
import scala.reflect.io.AbstractFile
import scala.reflect.io.Path.jfile2path
import scala.tools.nsc.Global
import scala.tools.nsc.Settings
…
import scala.tools.nsc._
object Compiler extends Global(new Settings()) {
new Run // This is line 24 from the stack trace!
def parse(path: File) = {
val code = AbstractFile.getFile(path)
val bfs = new BatchSourceFile(code, code.toCharArray)
val parser = new syntaxAnalyzer.UnitParser(new CompilationUnit(bfs))
parser.smartParse()
}
}
val ast = Compiler.parse(file)
其中, scala-library
, scala-compiler
和 scala-reflect
被定义为依赖关系 build.sbt
。
对于古玩/背景信息
该应用程序的目的是帮助Java和Scala程序的本地化。上面代码片段的任务是从Scala文件中获取AST,以便在那里找到方法调用。
问题
- 鉴于Scala库包含在JAR文件中,为什么需要使用JAR调用JAR
-Xbootclasspath/p:scala-library.jar
? - 为什么应用程序的其他部分运行得很好
scala.runtime
据报道以后失踪?