执行 .jar 文件时,`scala` 不需要 -jar,而 `java` 需要吗?

Tim*_*Tim 0 java scala

我想知道为什么在执行 .jar 文件时scala不需要-jar, while java

例如:

scala target/some.jar

java -jar target/someother.jar
Run Code Online (Sandbox Code Playgroud)

我查看了scalashell 脚本,它调用java如下:

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  "${classpath_args[@]}" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"
Run Code Online (Sandbox Code Playgroud)

难道纠正scala通行证target/some.jar作为一部分"$@"java,因此java命令没有前缀 target/some.jar-jar

谢谢。

Mar*_*lic 5

分析MainGenericRunner我们看到scalarunner的源代码试图猜测用户的意图

  def runTarget(): Option[Throwable] = howToRun match {
    case AsObject =>
      ObjectRunner.runAndCatch(settings.classpathURLs, thingToRun, command.arguments)
    case AsScript if isE =>
      ScriptRunner(settings).runScriptText(combinedCode, thingToRun +: command.arguments)
    case AsScript =>
      ScriptRunner(settings).runScript(thingToRun, command.arguments)
    case AsJar    =>
      JarRunner.runJar(settings, thingToRun, command.arguments)
    case Error =>
      None
    case _  =>
      ...
  }
Run Code Online (Sandbox Code Playgroud)

其中howToRun潜在的呼吁guessHowToRun

  private def guessHowToRun(target: String): GenericRunnerCommand.HowToRun = {
    if (!ok) Error
    else if (io.Jar.isJarOrZip(target)) AsJar
    else if (ScalaClassLoader.classExists(settings.classpathURLs, target)) AsObject
    else {
      val f = io.File(target)
      if (!f.hasExtension("class", "jar", "zip") && f.canRead) AsScript
      else {
        Console.err.println("No such file or class on classpath: " + target)
        Error
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

我们可以通过提供-howtorun标志来明确:

scala -howtorun:jar some.jar
Run Code Online (Sandbox Code Playgroud)

Scala 应用程序也可以通过 运行java -jar,例如,如果我们在build.sbt

Compile / mainClass := Some("example.MyMain")
Run Code Online (Sandbox Code Playgroud)

并执行sbt assembly,那么下面生成的fat jartarget/就可以这样执行了

java -jar myapp-assembly.jar
Run Code Online (Sandbox Code Playgroud)