我使用SBT / scala,但这个问题也适用于Maven / Java项目,因为SBT基于Maven结构。
我想设置一个共享公共Web应用程序部署的多模块应用程序。如何在Maven / SBT中构建我的项目,在包装步骤中是否可以使用webapp?
结构
sharedlibrary/
webapp/
module1
module2
module3
所以当我打包module1(依赖于sharedlibrary)时,我喜欢最终war文件中包含的webapp。 webapp将具有代码,该代码根据它启动的服务器加载正确的Module1 Main类。这在maven / sbt中是否可以轻松实现?
答案 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 module1
和copy-dependencies
,sbt会将类文件从 webapp 复制到 module1 将war/WEB-INF/classes
和依赖的罐子放到war/WEB-INF/lib
。
对于Google App Engine,我在运行开发服务器或将项目上传到appspot之前执行此操作,并且它工作正常,但有一天自动化该过程会很好。
答案 1 :(得分:0)