ティム:
私は、なぜ思っていた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