在多模块Java / scala项目中有一个通用的webapp?

时间:2012-05-25 16:14:37

标签: java scala maven sbt

我使用SBT / scala,但这个问题也适用于Maven / Java项目,因为SBT基于Maven结构。

我想设置一个共享公共Web应用程序部署的多模块应用程序。如何在Maven / SBT中构建我的项目,在包装步骤中是否可以使用webapp?

结构

sharedlibrary/
   webapp/
module1
module2
module3

所以当我打包module1(依赖于sharedlibrary)时,我喜欢最终war文件中包含的webapp。 webapp将具有代码,该代码根据它启动的服务器加载正确的Module1 Main类。这在maven / sbt中是否可以轻松实现?

2 个答案:

答案 0 :(得分:1)

我不太熟悉sbt的复杂性,但最近我开始建立一个类似的项目。以下是我首先尝试的情况。

1)在与module *文件夹相同的级别创建一个“project”子目录。

2)使用以下内容创建一个新文件“project / Build.scala”。请务必将destPath值更改为您需要的目录名称。此示例中的路径设置为使用每个模块中的war文件夹与Google App Engine配合使用。

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 module1copy-dependencies,sbt会将类文件从 webapp 复制到 module1 war/WEB-INF/classes和依赖的罐子放到war/WEB-INF/lib

对于Google App Engine,我在运行开发服务器或将项目上传到appspot之前执行此操作,并且它工作正常,但有一天自动化该过程会很好。

答案 1 :(得分:0)