如何将遗留Java/J2EE网站迁移到现代脚本语言(PHP、Python/Django等)?
我想把一个老旧的Java网络应用程序(J2EE)迁移到一种脚本语言——任何脚本语言——这样可以提高编程效率。
有没有什么简单的方法可以做到这一点?有没有自动化工具可以把大部分业务逻辑转换过来?
4 个回答
如果你使用自动化工具来“移植”一个网页应用,几乎可以肯定将来编程的效率会降低,而不是提高。
一个好的脚本语言可以在优秀程序员的使用下提高编程效率,前提是这些程序员懂得在这种语言中如何写出好的代码。自动化工具通常并不是为了输出优雅或写得好的代码而设计的,它们只会生成能工作的代码。
只有在你花时间重新实现这个网页应用后,编程效率才有可能提高。不过,由于重新实现所需的时间,这样做可能会带来提升,也可能不会。
如果你已经在Java中实现了大量的业务逻辑,那你有两个选择。
第一个选择是使用一种可以在JVM(Java虚拟机)上运行的高级语言,并且它有自己的网络框架,比如Groovy、Grails,或者JRuby和Rails。这样,你就可以直接利用你在Java中实现的所有业务逻辑,而不需要重新设计整个网站。你应该能够享受到这些框架在网页开发方面提高的效率,同时还能继续使用你现有的业务逻辑。
另一种方法是把你的业务逻辑层变成一组服务,通过标准的RPC(远程过程调用)机制提供,比如REST、SOAP、XML-RPC,或者其他一些简单的XML(YAML或JSON)通过HTTP协议(也可以看看DWR),这样前端就可以调用这些服务来访问你的业务逻辑。
第一种方法,使用JVM上的高级语言,可能比第二种方法需要的重新架构要少。
如果你的目标是完全迁移出Java,那么这两种方法都可以让你一步一步地进行迁移。你可能会发现这种混合的方法比完全放弃要好,因为JVM有很多库,并且能很好地与其他系统集成。
你需要做的事情如下。
首先,确保你能走路再去跑步。先做一些简单的东西,可能和你主要项目有点关系。
千万不要直接去做最终项目的一部分,然后希望它能“进化”成最终项目。这样做通常不会有好结果。为什么呢?因为你会犯一些傻错误。但你又不能删除或修改这些错误,因为你是想把这些错误变成最终项目的一部分。
接下来,选择一个框架。什么?第二步?没错,第二步。在你实际用一些脚本语言和框架做点什么之前,你对自己在做什么没有真正有用的概念。一旦你做了点东西,你就会有更清晰的看法。
你可能会说:“等一下,为了完成第一步,我得先选一个框架。”这没错。不过,第一步的选择是可以更改的。选错框架在第一步不会有什么长期的坏影响。那只是学习而已。
第三,利用你选择的框架和一些经验,把你现有的网站拆分成可以用新框架构建的部分。然后按重要性给这些部分排个序,从最重要到最不重要。
千万不要把整个转换计划成一个庞大的项目。这样做从来都不行。这样会让一个大任务变得比必要的更复杂。
我们以Django作为示例框架。你会有模板、视图函数、模型定义、URL映射和其他细节。
对于每个构建,做以下几件事:
把你现有的模型转换成Django模型。这不会完全适应你旧的SQL。你需要重新思考你的模型,修正旧的错误,纠正你一直想修复的旧bug。
编写单元测试。
构建一个转换工具,把旧数据导出并导入到新模型中。
构建Django管理页面,以便查看和操作新数据。
选择一些代表性的页面,把它们改造成合适的模板。你可能会用到一些旧的JSP页面。不过,不要在这上面浪费太多时间。用HTML来创建Django模板。
规划你的URL和视图函数。有时,这些视图函数会利用旧的动作类。不要“转换”。从头开始重写。使用你新的语言和框架。
唯一值得保留的是数据和操作概念。不要试图保留或转换代码。这是误导性的。你可以把JUnit的单元测试转换成Python的unittest。
几个月前我给过这个建议。在处理过程中,我需要进行一些指导和审查。修订后的站点已经上线。没有从旧技术转换;他们按照建议从头重写了。开发者很满意,网站运行良好。