Запустите созданное sbt приложение без sbt

Это как-то продолжение этого вопроса.

Когда я создаю пакет Scala с sbt, я могу запустить его, используя один из следующих способов:

  • просто набрав run в консоли sbt

  • или создав файл jar (используя one-jar или assembly) и запустив эту банку в системной консоли, набрав java -jar myjar.jar

Но я не знаю, как

  • Запустите мой пакет из программы Scala? (не консоль sbt Scala, в которой все работает нормально, набрав import mypackage._)

  • используйте мой пакет Scala в другом проекте? например, импортируя myjar в другой проект?


EDIT: вы можете забыть мои вопросы ниже sbt-start-script, потому что теперь я использую sbt-native-packager (Я пробовал это сейчас, и это работает, но мои предыдущие вопросы остаются открытыми).


Я попытался использовать sbt-start-script, но не удалось. target/start script хорошо создан, но я получаю такие ошибки:

$ sh target/start
target/start: 2: target/start: Bad substitution
Exception in thread "main" java.lang.NoClassDefFoundError: Hi
Caused by: java.lang.ClassNotFoundException: Hi
...

Здесь у меня просто есть файл main.scala в папке src/main/scala, и это:

object Hi { def main(args: Array[String]) = println("Hi!") }

Я использую эти настройки в build.sbt:

import com.typesafe.sbt.SbtStartScript

seq(SbtStartScript.startScriptForClassesSettings: _*)

Ответ 1

Существует несколько способов использования вашего проекта в другом проекте. Я не буду публиковать публикацию в удаленном репозитории, поскольку это, вероятно, то, что вы не хотите делать в любом случае (по крайней мере, на данный момент).

Предположим, что у вас есть проект под названием projectA - build.sbt:

name := "project-a"

organization := "com.acme"

version := "0.1.0"

И у вас есть еще один проект под названием projectB, где вы хотите использовать классы, определенные в projectA.

Неуправляемая зависимость

Один из самых простых способов - использовать его как неуправляемую зависимость. Вы можете сделать это, поместив jar файл, созданный package, assembly или любую другую команду, производящую артефакт.

Локальный репозиторий

Другой способ использования вашей зависимости - опубликовать его в локальном репозитории. Учитывая проект A, как определено выше, в build.sbt проекта B, добавьте зависимость

libraryDependencies += "com.acme" %% "project-a" % "0.1.0"

Теперь вы можете опубликовать projectA в своем локальном репозитории, выполнив publishLocal в проектеA. Преимущество этого подхода заключается в том, что если ваш проектA объявляет какие-либо зависимости, они будут добавляться как переходные зависимости к projectB.

Зависимость проекта

Последний способ, который приходит мне на ум, - объявить зависимость напрямую от projectA. Вы можете сделать это, создав файл build.sbt в проектеB, который выглядит примерно так:

lazy val projectA = file("/home/lpiepiora/q-23607291/projectA")

lazy val projectB = project in file(".") dependsOn projectA

Теперь классы, объявленные в projectA, должны быть видны в projectB.