Playframework 2.0 重头戏2-如何将项目(库)添加为依赖项

Playframework 2.0 重头戏2-如何将项目(库)添加为依赖项,playframework-2.0,sbt,sbt-idea,Playframework 2.0,Sbt,Sbt Idea,我的团队希望在Play2中重新构建我们的一个应用程序。该应用程序分为两个web应用程序,它们位于同一数据库的顶部:客户端(读)和管理员(读/写) 在新的体系结构中,我们希望构建两个Play2服务器来公开RESTAPI。将有两个单页AngularJS应用程序位于每个应用程序的前面。但这两台服务器共享相同的功能。因此,我们希望构建一个公共库,公开数据访问层(模型和DAO)。每台服务器都有自己的一组服务 客户端(REST服务器):读取 客户服务 公共图书馆 管理(REST服务器):读/写(完整CR

我的团队希望在Play2中重新构建我们的一个应用程序。该应用程序分为两个web应用程序,它们位于同一数据库的顶部:客户端(读)和管理员(读/写)

在新的体系结构中,我们希望构建两个Play2服务器来公开RESTAPI。将有两个单页AngularJS应用程序位于每个应用程序的前面。但这两台服务器共享相同的功能。因此,我们希望构建一个公共库,公开数据访问层(模型和DAO)。每台服务器都有自己的一组服务

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

  • 客户服务
  • 公共图书馆
管理(REST服务器):读/写(完整CRUD)

  • 行政服务
  • 公共图书馆
我使用的是IntelliJ 13,设置起来很困难。我查看了以下来源:

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

  • 我的项目

    • 应用程序
    • 形态
    • 公开的
  • 我的图书馆

    • src
      • 主要
        • 爪哇
        • 斯卡拉
  • 计划
    • Build.scala

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

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

示例Play2配置: 我将继续并假设您已经使用Play new创建了两个Play项目

我们希望这样设置项目:

  • ClientPlay项目
    • 应用程序
    • 形态
    • 公开的
  • AdminPlay项目
    • 应用程序
    • 形态
    • 公开的
  • 共享图书馆
    • 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文件并导入它们;可能是依赖项对象、解析器对象等。这实际上取决于复杂性级别。

我通过放弃SBT作为依赖项/构建工具解决了这个问题。我最终通过一个插件()使用了Maven。这个插件工作得很好。Maven与传统Java应用程序一样使用

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


就像我说的,Play2 Maven插件工作得很好!我强烈推荐它用于涉及项目依赖关系的复杂Play2应用程序。

谢谢您的回复。问题-所有这些项目都是在根项目中定义的还是完全独立的?在本例中,它们都位于根项目中;您可能能够将构建设置分发给子项目,但我不知道您将如何进行。我也有点怀疑这样做的好处;我认为最好在根项目文件夹中的多个文件中分散设置;即使在一个像Play框架本身这样大的项目中,他们也在根项目文件夹中拥有所有的定义和设置。我们计划让客户端和管理员在他们自己的服务器上(这样他们的负载不会相互影响),但会有一个共同的代码层(DAO等)。出于这个原因,当我为每个项目创建一个Play项目时,我希望有一个库,两者可以共享,以避免重复代码和版本控制问题。你是说这不可能在游戏/SBT中实现?我想知道在共享模块上创建软链接是否能解决这个问题。