У меня есть структура пакета, аналогичная приведенной ниже;
myapplication/
├── my-library/
│ └── src
│ └──main
│ └── scala
│
├── my-other-library/
│ └── src/
│ └──main/
│ └── scala/
│── my-executable-project/
│ │── src/
│ │ └──main/
│ │ └── scala/
│ └── resources/
│ └── somefile.txt
└── build.sbt
Когда я запускаю тесты через sbt
или intellij;
- относительные файлы (например,
new File("build.sbt")
) относительно myapplication
.
Когда я запускаю проект с reStart
через sbt-revolver или из двоичного файла;
my-executable-project
является рабочим каталогом. Таким образом, чтобы получить доступ к тому же файлу build.sbt
, я должен использовать new File("../build.sbt")
Эта структура проекта имеет смысл для меня, потому что позже могут быть другие исполняемые проекты. Я предпочитаю хранить каждый проект под родительским.
Только my-executable-project
упаковывается и запускается в производство. И когда он снова запускается, my-executable-project
является рабочим каталогом.
Единственное неудобство на данный момент - это когда я хочу сослаться на относительный файл, он отличается в тестах и регулярных запусках.
Я преодолел загрузку ресурсов с использованием classpath и classloader, но не смог найти способ для относительных ссылок на файлы. Когда приложение запускает тесты, сбой, когда тесты запускают приложение, терпит неудачу.
Редактировать: Так выглядит мой единственный build.sbt;
lazy val root = project
.in(file("."))
.disablePlugins(RevolverPlugin)
.aggregate(library1, library2, service, common)
.settings(
settings,
name := "parent",
version := "0.1"
)
lazy val common = project
.in(file("common"))
.disablePlugins(RevolverPlugin)
.settings(
settings,
name := "common",
libraryDependencies ++= ... some deps ...
)
lazy val library1 = project
.in(file("library1"))
.disablePlugins(RevolverPlugin)
.dependsOn(common)
.settings(
settings,
name := "library1",
libraryDependencies ++= ... some deps ...
)
lazy val library2 = project
.in(file("library2"))
.disablePlugins(RevolverPlugin)
.dependsOn(common)
.settings(
settings,
name := "library2",
libraryDependencies ++= ... some deps ...
)
lazy val service = project
.in(file("service1"))
.dependsOn(library1, library2)
.enablePlugins(JavaServerAppPackaging)
.settings(
settings,
name := "service1",
mappings in Universal ++= directory("service1/src/main/resources"),
mainClass in Compile := Some("my.main.class.service.Main"),
Revolver.enableDebugging(port = 5005, suspend = false),
libraryDependencies ++= ... some deps ...
)