У вас есть общее веб-приложение в многомодульном проекте Java / scala?

3

Я использую SBT/ scala, но этот вопрос может также применяться к проектам Maven/Java, поскольку SBT основан на структурах Maven.

Я бы хотел создать многопроцессорное приложение с общим развертыванием webapp. Как в Maven/SBT я должен структурировать свой проект, и на шаге пакета есть доступный webapp?

Структура

sharedlibrary/
   webapp/
module1
module2
module3

поэтому, когда я упаковываю модуль 1 (который зависит от sharedlibrary), я хотел бы, чтобы webapp включался в окончательный файл войны. Webapp будет иметь код, который загружает правильный основной класс Module1 на основе того, на каком сервере он запускался. Возможно ли это в простой форме в maven/sbt?

Теги:
maven
sbt

2 ответа

1

Я не очень хорошо разбираюсь в тонкостях 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, и он отлично работает, хотя было бы неплохо автоматизировать процесс больше когда-нибудь.

0

Да

см. мультипроекты SBT:

https://github.com/harrah/xsbt/wiki/Getting-Started-Multi-Project

и плагин sbt-assembly:

https://github.com/sbt/sbt-assembly

Ещё вопросы

Сообщество Overcoder
Наверх
Меню