一个复杂的项目不一定只有一个Play 应用组成。你可以把一个大项目分成几个小的应用,甚至你可以把一些和Play 应用没关系的逻辑提取到一些标准的JAVA 或SCALA 类库里面。
阅读这篇文章 SBT documentation on multi-project builds.可以获得更多的帮助。sub-projects 没有它们自己的构建文件,它们和它们的父工程共享构建文件。
添加一个简单的 sub-project你可以让你的应用依赖一个简单的库工程。要做的只是在你的‘project/Build.scala’构建文件里面添加一个新的工程定义:
import sbt._ import Keys._ import play.Project._ object ApplicationBuild extends Build { val appName = "my-first-application" val appVersion = "1.0" val appDependencies = Seq( //if it's a java project add javaCore, javaJdbc, jdbc etc. ) val mySubProject = Project("my-library", file("myLibrary")) val main = play.Project( appName, appVersion, appDependencies, path = file("myProject") ).dependsOn(mySubProject) }
在这里我们在应用的‘myLibrary’文件夹里定义了一个 sub-project。这个 sub-project 是一个标准的sbt 工程,使用默认的layout:
myProject └ app └ conf └ public myLibrary └ src └ main └ java └ scala project └ Build.scala
当你在你的build 里面启用sub-project ,你可以只关注于这个子项目,单独编译测试运行它。可以在Play 控制台输入 project 命令来列出所有的项目。
[my-first-application] $ projects [info] In file:/Volumes/Data/gbo/myFirstApp/ [info] * my-first-application [info] my-library
默认的项目是项目名按字母排序的地一个项目。你可以使用aaaMain 命令来使用你的主要项目。你可以使用 project 命令来改变当前工程。
[my-first-application] $ project my-library [info] Set current project to my-library
当你在开发模式下运行Play 应用,依赖的项目会自动编译,如果编译失败,你依然可以在浏览器里看到相关信息。
把你的web分成几个小web
由于Play 应用只是一个含有默认配置文件的标准的sbt 工程,所以它可以依赖其它的Play 应用。
这个配置和之前的非常接近。配置你的 sub-project 就像配置 play.Project 一样简单。
import sbt._ import Keys._ import play.Project._ object ApplicationBuild extends Build { val appName = "zenexity.com" val appVersion = "1.2" val common = play.Project( appName + "-common", appVersion, path = file("common") ) val website = play.Project( appName + "-website", appVersion, path = file("website") ).dependsOn(common) val adminArea = play.Project( appName + "-admin", appVersion, path = file("admin") ).dependsOn(common) val main = play.Project( appName, appVersion, path = file("main") ).dependsOn( website, adminArea ) }
这里我们定义了一完整的被分割成两个部分的项目:website 部分和 admin 部分。这两个部分通过一个common 模块彼此依赖。
如果你想在编译测试主工程时同时依赖的子项目也重新编译和测试,那么你需要添加一个 “aggregate”选项。
val main = PlayProject( appName, appVersion ).dependsOn( website, adminArea ).aggregate( website, adminArea )
注意:为了避免名字冲突,请确保你的sub-projects 的 controller 包括 Assets controller 使用和主项目不同的命名空间。
分割route文件由于 play 2.1 支持把 route 文件分割成为几部分。如果你想构建一个健壮的,可重用的多模块的Play 应用,这是一个非常方便的特性。
考虑一以下构建文件project/Build.scala
import sbt._ import Keys._ import play.Pr
package com.css.common.hibernate3;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
/**
* DB层的Dao-接口类 <br/>
*
* @author何青
*/
publicinterfaceGenericHibernateDao<T> {
/**
*添加一个对象
* @param t
* @throws Exception
*/
publicvoid save(T t) throws Exception;
/**
* 更新一对象
* @param t
* @throws Exception
*/
publicvoid update(T t) throws Exception;
/**
* 加载一对象
* @param id
* @return T
* @throws Exception
*/
public T load(Serializable id) throws Exception;
/**
* 获取一对象
* @param id
* @return T
* @throws Exception
*/
public T get(Serializable id) throws Exception;
/**
* 删除一个对象
* @param o
* @throws Exception
*/
publicvoid remove(Object o) throws Exception;
/**
* 将传入的游离状态的对象的属性复制到持久化对象中,并返回该持久化对象。
* 如果该session中没有关联的持久化对象,加载一个,如果传入对象未保存,保存一个副本并作为持久对象返回,传入对象依然保持游离状态
* @param entity POJO实体
* @return持久化对象
* @throws Exception
*/
public Object merge(Object entity) throws Exception;
/**
* 执行本地SQL语句
* 【注意:不能执行Select查询语句】
* @param sql
* @throws Exception
*/
publicvoid executeSQL(St
//本译文只供学习使用,未经作者许可,不得用于其它任何用途
//译者:xiaofeng
//修改日期:2013/03/19
//版本:V1.0
//版权所有,盗版必究。