Aug*_*ing 12 scala executable-jar scala-compiler
我正在尝试运行作为JAR打包的Scala应用程序(包括依赖项),但是在使用该-Xbootclasspath/p选项添加Scala库之前,这会失败.
调用失败:
java -jar /path/to/target/scala-2.10/application-assembly-1.0.jar
在应用程序执行了一些预期输出后,控制台显示:
线程"main"中的异常scala.reflect.internal.MissingRequirementError:找不到编译器镜像中的对象scala.runtime.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)scala.reflect.internal.Mirrors $ RootsBase.getModuleOrClass(Mirrors.scala:40)at scala.reflect.internal.Mirrors $ RootsBase.getModuleOrClass(Mirrors.scala:61)at scala.reflect.internal.镜像$ 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)scala.reflect.internal.Definitions上的scala.reflect.internal.Definitions $ DefinitionsClass.RuntimePackage(Definitions.scala:181)scala.reflect.internal.Definitions $ DefinitionsClass.RuntimePackageClass $ lzycompute(Definitions.scala:182)at scala.reflect.internal.Definitions scala.reflect上的$ DefinitionsClass.RuntimePackageClass(Definitions.scala:182).在scala.reflect.internal.Definitions $ DefinitionsClass.AnnotationDefaultAttr(Definitions.scala:1014)的scala.reflect.internal.Definitions $ DefinitionsClass.syntheticCoreClasses $ lzycompute中的internal.Definitions $ DefinitionsClass.AnnotationDefaultAttr $ lzycompute(Definitions.scala:1015)定义.scala:1144)scala.reflect.internal.Definitions $ DefinitionsClass.syntheticCoreClasses(Definitions.scala:1143)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.(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,以便在那里找到方法调用.
问题
-Xbootclasspath/p:scala-library.jar?scala.runtime以后报告丢失了?som*_*ytt 10
使用熟悉的按键配置设置的简便方法:
  import scala.tools.nsc.Global
  import scala.tools.nsc.Settings
  def main(args: Array[String]) {
    val s = new Settings
    s processArgumentString "-usejavacp"
    val g = new Global(s)
    val r = new g.Run
  }
这适用于您的场景.
更简单:
java -Dscala.usejavacp=true -jar ./scall.jar
奖金信息,我碰巧遇到了启用提交消息:
前进并实现了类路径,如电子邮件中所描述的那样,理论上我已经知道我在做什么了.
**公共服务声明**
如果您的代码停止使用此提交(很可能错误类似于"找不到对象标量"),您可以使用以下任一方法重新运行:
在命令行上传递-usejavacp
将系统属性"scala.usejavacp"设置为"true"
这些中的任何一个都会提醒scala您希望scala也使用java应用程序类路径.