java`は、.jarファイルを、実行しない場合には ``ながらscala`は、-jar必要としないのですか?

ティム:

私は、なぜ思っていたscala必要はありません-jarが、java.jarファイルを実行するときに、いますか?

例えば:

scala target/some.jar

java -jar target/someother.jar

私は見てscala、それが呼び出す、シェルスクリプトjavaとして:

execCommand \
  "${JAVACMD:=java}" \
  $JAVA_OPTS \
  "${java_args[@]}" \
  "${classpath_args[@]}" \
  -Dscala.home="$SCALA_HOME" \
  $OVERRIDE_USEJAVACP \
  $WINDOWS_OPT \
   scala.tools.nsc.MainGenericRunner  "$@"

それはそれが正しいscala通るtarget/some.jar一部として"$@"java、そのためjavaのコマンドは、接頭辞ないtarget/some.jar-jar

ありがとうございました。

マリオGalic:

ソースコード解析MainGenericRunner私たちが見るscalaユーザーが意図したものを推測するランナー試行を

  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 _  =>
      ...
  }

どこ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
      }
    }
  }

我々は提供することで、明示的にすることができ-howtorunフラグ:

scala -howtorun:jar some.jar

Scalaのアプリケーションも経由して実行することができjava -jar、我々は、メインクラスを指定した場合、例えば、build.sbt

Compile / mainClass := Some("example.MyMain")

そして実行sbt assembly後、生成脂肪のjarの下では、target/そのように実行することができます

java -jar myapp-assembly.jar

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=300788&siteId=1