Создать скрипт с classpath из SBT - PullRequest
10 голосов
/ 16 сентября 2011

Я бы хотел, чтобы SBT создал файл и записал полный путь к классам проекта (scala, управляемые и неуправляемые библиотеки, классы проекта) для определенного этапа (в данном случае только для compile).

Я пытаюсь воспроизвести что-то, что я сделал с Maven, используя maven-antrun-plugin:

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-antrun-plugin</artifactId>
      <version>1.6</version>
      <executions>
        <execution>
          <id>generate-runner</id>
          <phase>package</phase>
          <configuration>
            <target>
              <property name="runtime_classpath" refid="maven.runtime.classpath" />
              <property name="runtime_entrypoint" value="com.biasedbit.webserver.Bootstrap" />

              <echo file="../../bin/run-server.sh" append="false">#!/bin/sh
java -classpath ${runtime_classpath} ${runtime_entrypoint} $$*
              </echo>
            </target>
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Как я могу сделать это с SBT?

Ответы [ 3 ]

11 голосов
/ 17 сентября 2011

Основы верны в ответе Давида.Есть несколько небольших способов, которыми это можно улучшить.Средство запуска 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 ...
  )
}
3 голосов
/ 17 сентября 2011

Вы можете создать задачу для создания файла для запуска приложения.@Kipton Barros опубликовал это в Как запустить основной класс sbt из оболочки как обычную программу командной строки? :

  val MkUnixlauncher = config("mkunixlauncher") extend(Compile)
  val mkunixlauncher = TaskKey[Unit]("mkunixlauncher")
  val mkunixlauncherTask = mkunixlauncher <<= (target, fullClasspath in Runtime) map { (target, cp) =>
    def writeFile(file: File, str: String) {
      val writer = new PrintWriter(file)
      writer.println(str)
      writer.close()
    }
    val cpString = cp.map(_.data).mkString(System.getProperty("path.separator"))
    val runtime_entrypoint = "com.biasedbit.webserver.Bootstrap"
    val launchString = """
CLASSPATH="%s"
scala -usejavacp -Djava.class.path="${CLASSPATH}" %s "$@"
""".format(cpString, entrypoint)
    val targetFile = (target / "run-server.sh").asFile
    writeFile(targetFile, launchString)
    targetFile.setExecutable(true)
  }

Это создает файл с именем run-server.shв вашей целевой директории, в которой правильно установлен classpath для запуска приложения.Добавьте mkunixlauncherTask к вашим настройкам сборки в Build.scala (или build.sbt), а затем вы можете дать команду «mkunixlauncher» для создания сценария.

Настройка по вкусу.

2 голосов
/ 15 февраля 2012

Только что обнаружен плагин сценария запуска sbt: https://github.com/typesafehub/xsbt-start-script-plugin:

Этот плагин позволяет генерировать цель / запуск сценария для проекта.Скрипт будет запускать проект «на месте» (без необходимости сначала создавать пакет).

Сценарий target / start аналогичен sbt run, но не использует SBT.sbt run не рекомендуется для производственного использования, поскольку он хранит SBT в памяти.target / start предназначен для запуска приложения в рабочем состоянии.

Плагин добавляет скрипт запуска задачи, который генерирует target / start.Он также добавляет этапное задание с псевдонимом к задаче start-script.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...