Это как-то продолжение этого вопроса.
Когда я создаю пакет 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: _*)
Существует несколько способов использования вашего проекта в другом проекте. Я не буду публиковать публикацию в удаленном репозитории, поскольку это, вероятно, то, что вы не хотите делать в любом случае (по крайней мере, на данный момент).
Предположим, что у вас есть проект под названием 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.