播放2 - 如何将项目(库)添加为依赖项

时间:2014-02-05 19:55:44

标签: playframework-2.0 sbt sbt-idea

我的团队希望在Play2中重新构建我们的一个应用程序。该应用程序分为两个位于同一数据库之上的Web应用程序:客户端(读取) admin(读/写)

在新架构中,我们正在寻找构建两个公开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

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

  • myProject的

    • 应用
    • CONF
    • 公共
  • 在MyLibrary

    • SRC
        • 的java
  • 项目
    • Build.scala

2 个答案:

答案 0 :(得分:1)

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

话虽如此,听起来你也可以使用一些关于设置Build.scala的说明,所以让我们深入研究。

示例Play2配置:

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

我们想要设置这样的项目:

  • ClientPlayProject
    • 应用
    • CONF
    • 公共
  • AdminPlayProject
    • 应用
    • CONF
    • 公共
  • SharedLibrary
    • SRC
      • 测试
  • 项目
    • Build.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中执行导入项目步骤,它就会让你的代码完成所有平方并且很好。

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

答案 1 :(得分: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应用程序。