Основы верны в ответе Давида.Есть несколько небольших способов, которыми это можно улучшить.Средство запуска Java можно использовать напрямую, поскольку библиотека Scala включена в classpath.sbt может автоматически определять главный класс, если определен только один.У sbt также есть некоторые методы, которые могут упростить работу с файлами, такие как служебные методы в sbt.IO .
TaskKey[File]("mkrun") <<= (baseDirectory, fullClasspath in Runtime, mainClass in Runtime) map { (base, cp, main) =>
val template = """#!/bin/sh
java -classpath "%s" %s "$@"
"""
val mainStr = main getOrElse error("No main class specified")
val contents = template.format(cp.files.absString, mainStr)
val out = base / "../../bin/run-server.sh"
IO.write(out, contents)
out.setExecutable(true)
out
}
. Это может быть непосредственно в build.sbt
В качестве альтернативы, определите ключ отдельно и введите его в project/Build.scala
:
import sbt._
import Keys._
object MyBuild extends Build {
val mkrun = TaskKey[File]("mkrun")
lazy val proj = Project("demo", file(".")) settings(
mkrun <<= ... same argument as above ...
)
}