RichFaces 基于的应用程序云部署支持一直是热门话题之一,现在终于实现了!实际上,开发工作已于一个月前完成,并在 Java One 会议 上宣布。由于要稳定该特性并创建一个特殊的模板以简化启动过程,官方公告被推迟。
让我们回顾一下已经完成的工作以及将 RichFaces 应用程序部署到 Google 应用引擎所需执行的步骤。
GAE 部署限制
Google 应用引擎部署为 Java 开发者引入了一些限制。以下是一些对我们开始很重要的事项
- 不允许创建新线程
- 禁止使用 Java2D
- 无法访问文件系统
- 其他限制可以在 GAE 知识库中检查
如何避免使用 Java2D?资源生成 Maven 插件。
我们团队需要额外开发的一个重要限制是 Java2D 使用限制。RichFaces 皮肤机制依赖于这些类来动态生成资源以支持应用程序皮肤。为了满足 GAE 的限制而不会丢失 RichFaces 的灵活外观,需要一个新资源插件来创建 RichFaces 资源的静态版本
- 将皮肤参数替换为应用程序使用的所有皮肤的 CSS
- 压缩 CSS 文件
- 在 CSS 中提供相对 URL
- 生成皮肤图像
- 提取应用程序使用的所有 JavaScript 文件并压缩它们
- 为所有处理的文件生成描述符。RichFaces 框架使用此描述符来指向适当资源(例如放置在外部服务器/CDN 上)
在 生成的应用程序 pom.xml 中检查插件定义和配置(maven-resources-plugin)
之后需要做的只是使用上下文参数在 web.xml 中定义静态资源位置,例如
<context-param> <param-name>org.richfaces.staticResourceLocation</param-name> <param-value>#{facesContext.externalContext.requestContextPath}/static-resources/#{resourceLocation}</param-value> </context-param>
注意:这也可以在服务器之间提供资源,有助于在生产环境中扩展规模。
还需要考虑的其他事项
有关GAE限制的一些其他点。其中一些与RichFaces的使用没有直接关系,但任何JSF开发人员都应该考虑。
- 当前的推送组件架构不支持监听器序列化。
因此,我们仍然需要完成推送的架构重设计,以便为该组件正确支持云环境。
- 不允许创建新线程
因此,尝试直接移植3.3.x的一些简单示例(例如轮询/推送),将不会正常工作。
- 在GAE上运行JSF 2.0即使没有RichFaces 4也需要一些额外的设置。
有关详细信息,请参阅GAE知识库中的这篇文章。
- 无法访问文件系统
开发人员应配置缓存以使用Google Memcache实现。
GAE项目生成和构建的Archetype
如上所述,在JavaOne,我们创建了一个特殊的Archetype,用于创建已配置为GAE部署的JSF 2.0、RichFaces 4应用程序骨架。要生成项目,只需执行
mvn archetype:generate -DarchetypeGroupId=org.richfaces.archetypes -DarchetypeArtifactId=richfaces-archetype-gae -DarchetypeVersion=4.0.0.20101004-M3 -DgroupId=<yourGroupId> -DartifactId=<yourArtifactId> -Dversion=1.0-SNAPSHOT
现在可以通过简单的mvn install执行来构建项目
注意
- Archetype的第一个发布版本是4.0.0.20101004-M3
- readme.txt文件包含将应用程序部署到GAE服务器或使用本地GAE SDK开发服务器进行本地测试的说明。
将应用程序部署到GAE账户
为了避免复制粘贴工作,这里提供了官方说明的链接,我们已成功用于测试部署。如果您已经创建了账户、注册了应用程序并正确配置了GAE SDK
- 确保在重新部署之前更新了appengine-web.xml中的版本
- 执行appcfg update <应用程序展开存档的路径>
- 就这样!只需转到您的账户并检查应用程序是否就位且正常工作!
在Twitter上获取我的博客更新
我的jroller.com博客