将 Grails 与现有的 Web 应用程序集成

Posted

技术标签:

【中文标题】将 Grails 与现有的 Web 应用程序集成【英文标题】:Integrating Grails with existing web application 【发布时间】:2012-05-14 08:02:52 【问题描述】:

我们有一个使用 Tapestry 4.1 编写的大型、笨重但相当稳定的 Web 应用程序,我们希望逐步摆脱它。为此,我们正在考虑在 Grails 中开发一些新功能。我们的客户永远不应该知道其中的区别,如果可能的话,内部也不会有人知道,例如在安装服务中,也应该关心——理想情况下,Grails 应用程序将与现有的 Tapestry 代码在同一个 WAR 中,只是将 GrailsDispatcherServlet 配置为更具体的路径。对现有应用程序的怪物构建过程进行最小的更改也是至关重要的——在 Gant 和 Ivy 中重做构建系统(目前是 Ant,正在过渡到 Maven)不是一种选择。如果我们可以在开发过程中使用爆炸的 WAR 进行实时重新加载,那就太好了。

问题,然后:

这可能吗? 如果是这样,我应该从哪里开始? 如果不是,那么下一个最佳方法是什么? 我需要注意什么?

注意我们不会使用 GORM;我们所有的数据都来自 Web 服务,我们已经拥有 Java 域和消息传递层。

【问题讨论】:

你是使用hibernate来持久化数据还是使用其他东西? 只是一些想法 - 如何单独创建 grails 应用程序,然后将 grails 应用程序的 war 与原始应用程序的 war 捆绑为一个 .ear 文件?这样,您可以保持您的原始构建,让 grails 按预期方式工作,并且只需在末尾添加额外的步骤来构建 .ear 文件。最大的问题是两者之间的集成程度如何,集成点是什么,以及如何进行适当的 url 重写以使其看起来无缝。 除了您将使用 Java 而不是 Groovy 之外,听起来您可能更适合使用 Spring MVC(Grails 的主要组件)。 @allthenutsandbolts 数据位于 Web 服务的另一端,碰巧确实使用 Hibernate 进行数据库访问,但也可以与其他更远的 Web 服务一起使用,并且由于历史原因,平坦文件(与旧版 C 应用程序共享)。 @GreyBeardedGeek 有趣的想法。我宁愿避免由于改变我们分发原始应用程序的方式而导致的构建/分发混乱(在构建文件和办公室政治中),但这可能最终成为我们必须走的路。 【参考方案1】:

好消息:是的,这是可能的。

坏消息:有点毛茸茸的。

至少有两种方式:

    按照 Dylan 的建议,修改 Grails 构建以适应您现有的应用程序,并进行一些调整。 创建另一个 Ant 目标,将现有 WAR 文件与 Grails 生成的 WAR 文件结合起来。

第一个选项,修改 Grails 构建。风险在于,当 Grails 更新版本时,定制和调整过的 Grails 构建可能会完全失败,并且您不会在这里或那里结束。解决这个问题需要深入了解框架如何生成构建。由于这是您第一次接触新框架,因此学习曲线可能过于陡峭。

我更喜欢第二个,因为您不需要搞乱 Grails 构建。您需要了解底层的 web.xml 配置是如何工作的。我假设您已经拥有这些知识,因为您也已经拥有自己的 Ant 构建。可能这是阻力最小的路径。

第二种方法的缺点是在开发过程中很难有爆炸的WAR。但是,如果您可以将旧应用程序和新应用程序分开,而无需在开发过程中将它们一起测试,那么您在使用 Grails 的轻量级开发服务器进行开发时会很开心。

下一步将逐步使旧应用程序能够在 Grails 下作为 Grails 调用的 Java 组件运行。

【讨论】:

【参考方案2】:

您可以通过运行 grails install-templates 命令编辑 web.xml 的模板以更改 servlet 映射

您可以使用Ant & Maven(或 Gradle)来构建 Grails 应用程序,但由于这不是“标准”方法,我的经验是可能需要进行一些小的调整。我已经使用 Ant 集成(它使用 ivy 作为依赖项)来构建并使用 Gradle 来包装 Ant 并根据特殊要求修改构建。

您可能遇到的问题是 Gant 脚本是 Grails 的核心,并且在这些脚本中发生了许多事情(取决于您使用的插件),这可能会导致尝试将两个构建合并在一起时出现问题,因为这些脚本不是编写的考虑到您的用例。

【讨论】:

以上是关于将 Grails 与现有的 Web 应用程序集成的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Gatling 与现有的 Spring-Boot + Gradle 应用程序集成

尝试将 LowDB 与现有的 db.json 集成

iOS - 如何将 Firebase Analytics 与现有的 Google Analytics、GoogleService-Info.plist 集成

如何将 SCNRenderer 与现有的 MTLCommandBuffer 结合起来?

将 grunt 与现有的 wordpress 实例一起使用

RN与现有的原生app集成