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

Posted

技术标签:

【中文标题】在多模块 Java/scala 项目中有一个通用的 webapp?【英文标题】:Have a common webapp in a multi module Java/scala project? 【发布时间】:2012-06-01 05:50:51 【问题描述】:

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

我想设置一个多模块应用程序,共享一个通用的 webapp 部署。我应该如何在 Maven/SBT 中构建我的项目并在打包步骤中使用 webapp?

结构

sharedlibrary/
   webapp/
module1
module2
module3

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

【问题讨论】:

【参考方案1】:

我对 sbt 的复杂性不是很熟悉,但我最近开始建立一个有点类似的项目。对于您的情况,我会首先尝试以下方法。

1) 在与您的模块*文件夹相同的级别上创建一个“项目”子目录。

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 的 @987654326 @ 和依赖 jar 到 war/WEB-INF/lib

对于 Google App Engine,我在运行开发服务器或将项目上传到 apppot 之前执行此操作,它运行良好,但如果有一天能进一步自动化该过程会更好。

【讨论】:

【参考方案2】:

是的

查看 SBT 多项目:

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

和 sbt-assembly 插件:

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

【讨论】:

以上是关于在多模块 Java/scala 项目中有一个通用的 webapp?的主要内容,如果未能解决你的问题,请参考以下文章

在多模块化项目中查看解析器配置

在多模块 Maven 项目中更新模块的版本号

在多模块项目中读取属性文件

使用 Spring 在多模块 Maven 项目中进行集成测试

在多模块 Spring Boot 项目中使用属性

在多模块 Maven 项目中构建所有模块后,如何运行集成测试?