1

我的团队正在寻求在 Play2 中重新构建我们的一个应用程序。该应用程序分为位于同一数据库顶部的两个 Web 应用程序:client(read)admin(read/write)

在新架构中,我们希望构建两个公开 REST API 的 Play2 服务器。每个前面都会有两个单页 AngularJS 应用程序。但两台服务器共享共同的功能。因此,我们正在寻求构建一个公共库来公开数据访问层(模型和 DAO)。每台服务器都有自己的一组服务。

客户端(REST 服务器):读取

  • 客户服务
  • 公共图书馆

管理员(REST 服务器):读/写(完整的 CRUD)

  • 管理服务
  • 公共图书馆

我正在使用 IntelliJ 13 并且很难设置它。我查看了以下来源:

http://www.playframework.com/documentation/2.2.1/SBTSubProjects

http://www.scala-sbt.org/release/docs/Getting-Started/Multi-Project

我相信我想要的是将库类型依赖项添加为(导入模块...),而不是向父项目添加模块

  • 我的项目

    • 应用程序
    • 会议
    • 上市
  • 我的图书馆

    • 源代码
      • 主要的
        • 爪哇
        • 斯卡拉
  • 项目
    • 构建.scala
4

2 回答 2

1

由于您使用的是 IntelliJ 13,因此您可以访问内置的 SBT 导入;不幸的是,这不能在现有项目上完成。但是,您可以从 SBT 构建文件导入项目,然后从 .idea 文件夹迁移任何项目设置(假设您使用的是基于目录的项目)。

话虽如此,听起来您也可以在设置 Build.scala 时使用一些说明,所以让我们深入研究一下。

示例 Play2 配置:

我将继续假设您已经使用play new创建了两个 Play 项目。

我们想像这样设置项目:

  • 客户PlayProject
    • 应用程序
    • 会议
    • 上市
  • AdminPlayProject
    • 应用程序
    • 会议
    • 上市
  • 共享库
    • 源代码
      • 主要的
      • 测试
  • 项目
    • 构建.scala

假设这样的布局,下面是一个 Build.scala 的示例:

import play.Project._
import sbt._
import sbt.Keys._


object BuildSettings {
  val appOrganization = "com.example"

  val appVersion = "0.0.1-SNAPSHOT"

  val commonResolvers = Seq(
    // Your common resolvers here
  )

  val commonSettings = Seq(
    organization := appOrganization,
    // Other shared settings
    resolvers ++= commonResolvers
  )

  val commonDeps = Seq(
    // Shared Dependencies for all 3 projects here.
  )

  val adminDeps = Seq(
    // Admin dependencies
  ) ++ commonDeps


  val clientDeps = Seq(
    // Client Dependencies
  ) ++ commonDeps

  val libraryDeps = Seq(
    // Library Deps
  ) ++ commonDeps
}

object Build extends Build {

  import BuildSettings._

  lazy val LibraryProject = Project("SharedLibrary", file("SharedLibrary"))
    .settings(commonSettings: _*)
    .settings(libraryDependencies ++= libraryDeps)

  lazy val AdminProject = play.Project("AdminPlayProject", appVersion, adminDeps, path = file("AdminPlayProject"))
    .settings(commonSettings: _*)
    .settings(libraryDependencies ++= adminDeps)
    .dependsOn(LibraryProject)

  lazy val ClientProject = play.Project("ClientPlayProject", appVersion, clientDeps, path = file("ClientPlayProject"))
    .settings(commonSettings: _*)
    .dependsOn(LibraryProject)

  lazy val aggregatedProjects = Seq[ProjectReference](
    LibraryProject,
    AdminProject,
    ClientProject
  )

  lazy val root = Project("Root", file("."))
    .settings(commonSettings: _*)
    .aggregate(aggregatedProjects: _*)
}

一旦您将 Build.scala 全部整理好,只需在 IntelliJ 中执行 Import Project 步骤,它就会让您的代码完成全部整理好,一切顺利。

请注意,您可能希望将其中的一部分分解为其他 .scala 文件并导入它们;也许是一个 Dependencies 对象、一个 Resolvers 对象等。它实际上取决于复杂程度。

于 2014-02-08T21:49:54.083 回答
0

我通过放弃 SBT 作为我的依赖/构建工具解决了这个问题。我最终通过插件(http://nanoko-project.github.io/maven-play2-plugin/maven/release/index.html)使用了 Maven。该插件效果很好。Maven 用于传统的 Java 应用程序。

我为每个“项目”(客户端、管理员、共享库)创建了三个 pom.xml 文件,并为父级创建了一个额外的 pom.xml。这里没有什么新鲜事。只是用于多项目依赖项的典型 Maven 设置。

就像我说的,Play2 Maven 插件非常好用!我强烈推荐它用于涉及项目依赖的复杂 Play2 应用程序。

于 2014-02-14T21:13:43.303 回答