Я использую SBT/ scala, но этот вопрос может также применяться к проектам Maven/Java, поскольку SBT основан на структурах Maven.
Я бы хотел создать многопроцессорное приложение с общим развертыванием webapp. Как в Maven/SBT я должен структурировать свой проект, и на шаге пакета есть доступный webapp?
Структура
sharedlibrary/
webapp/
module1
module2
module3
поэтому, когда я упаковываю модуль 1 (который зависит от sharedlibrary), я хотел бы, чтобы webapp включался в окончательный файл войны. Webapp будет иметь код, который загружает правильный основной класс Module1 на основе того, на каком сервере он запускался. Возможно ли это в простой форме в maven/sbt?
Я не очень хорошо разбираюсь в тонкостях sbt, но недавно начал создавать несколько похожий проект. Вот что я постараюсь в первую очередь для вашей ситуации.
1) создайте подкаталог "project" на том же уровне, что и папки вашего модуля *.
2) создайте новый файл "project/Build.scala" со следующим содержимым. Обязательно измените значение destPath
на нужное имя каталога. Пути в этом примере настроены для работы с Google App Engine с помощью папки war
в каждом модуле.
import sbt._
import Keys._
object MyBuild extends Build {
lazy val copyDependencies = TaskKey[Unit]("copy-dependencies")
def copyDepTask = copyDependencies <<= {
(dependencyClasspath in Runtime, baseDirectory) map { (dep, bp) =>
for (attrSrcPath <- dep) {
val srcPath = attrSrcPath.data
println(srcPath);
if (!srcPath.isDirectory) {
val destPath = bp / "war/WEB-INF/lib" / srcPath.getName
IO.copyFile(srcPath, destPath, preserveLastModified=true)
}
else {
val destPath = bp / "war/WEB-INF/classes/"
IO.copyDirectory(srcPath, destPath, preserveLastModified=true)
}
}
}
lazy val webapp = Project("webapp", file("sharedlibrary/webapp"))
lazy val module1 = Project("module1", file("module1"),
settings = Project.defaultSettings ++ Seq(copyDepTask)
) dependsOn(webapp)
lazy val module2 = Project("module2", file("module2"),
settings = Project.defaultSettings ++ Seq(copyDepTask)
) dependsOn(webapp)
lazy val module3 = Project("module3", file("module3"),
settings = Project.defaultSettings ++ Seq(copyDepTask)
) dependsOn(webapp)
}
3) из sbt, вы можете ввести project module1
и copy-dependencies
, а sbt будет копировать файлы классов из webapp в module1 war/WEB-INF/classes
и зависимые баночки до war/WEB-INF/lib
.
Для Google App Engine я делаю это до запуска сервера разработки или загрузки проекта в appspot, и он отлично работает, хотя было бы неплохо автоматизировать процесс больше когда-нибудь.
Да
см. мультипроекты SBT:
https://github.com/harrah/xsbt/wiki/Getting-Started-Multi-Project
и плагин sbt-assembly: