对于 Java 从业人员来说,无论是刚入门的新手还是专家,肯定都正在或者曾经使用过 Eclipse,这是一款优秀的编写 Java 程序的 IDE.
然而可能大多数 Java 开发人员都没有意识到,Eclipse 同时也能用来进行另一款在企业管理软件开发领域大名鼎鼎的编程语言的开发工作,这门语言就是 ABAP.
在 2022 年 3 月最新的 TIOBE 编程语言排行榜上,Python, C 和 Java 分列前三甲,而 ABAP 位列第 42 名。
ABAP 之前的两门语言,分别是同样出自豪门微软的 Powershell 和 TypeScript.
而 ABAP 这门编程语言,是企业管理软件巨头,德国最大的软件公司 SAP 使用的开发语言,其旗舰级产品 S/4HANA 和曾经成为 ERP 软件领域代名词的 R/3,都基于 ABAP 开发而成。
在 SAP 公司创始之初,ABAP 程序的编写工具是 SAP GUI,一个界面古朴的 IDE,如下图所示:
SAPGUI 这款 IDE 的页面布局设计,乍一看有点像现在的 Visual Studio Code,但 SAPGUI 诞生于 1992 年,可以说是 Visual Studio Code 的前辈了。
那么为什么 SAP 有了 SAPGUI 之后,还会选择将 Eclipse 改造成 ABAP 的另一款开发工具呢?这就是本文要阐述的内容。
SAP 在 Eclipse 框架的基础上,开发出了一系列专门用于 ABAP 开发的插件。这一经过改造后的 Eclipse,有了一个新的名称:ABAP Development Tools for SAP Netweaver,在 SAP 官方文档里经常简写为 ADT. 为了便于 Java 程序员阅读,本文余下部分中提到的 Eclipse,如无特殊说明,均代表 ADT.
下图是在 ADT 里点击 Help -> About 之后弹出的该 Eclipse 的版本号。
本文余下的部分从下列几个方面向大家介绍,经过 SAP 改造之后的 Eclipse(ADT),为何能成为企业管理软件领域的 ABAP 应用开发利器。
1. ADT的工作原理
很多从 Eclipse 做 Java 开发的朋友转到 ADT 后,最大的不习惯就是 ADT 没办法离线使用。即使是用 SAP 云平台 Neo 编程环境里的 SDK,开发人员也可以在本地完成开发后,使用命令行或者 Eclipse Run As 菜单将其发布到 SAP 云平台上。然而这种用法对于 ADT 来说行不通,因为后者仍然是一个 Client / Server模式中的 Client 端。从本质上讲,在开发 ABAP 时,Eclipse 和 SAP GUI 的区别,仅仅体现在对 Netweaver 服务器上开发资源的展示和操作方式有所差异罢了。
正因为这种 C/S 架构,每次我们在 ADT 里操作 Netweaver 上的 ABAP 资源时,比如编辑一个 ABAP 类并保存,实际上都是通过消费 ABAP 后台暴露出的 Restful API 来完成的。
这种 Restful API 的消费行为可以通过打开 ADT 里的 ABAP Communication Log 视图来观察。点击 Start logging 按钮:
在源代码里随便做一些改动,比如增加一个空行,能观察到这个修改动作触发了很多到 ABAP 后台的 HTTP 请求:
如果想自己调试这些后台操作的具体实现,用 SAP GUI 登录 ABAP 后台,使用事务码SICF找到节点/sap/bc/adt:
在节点处理类的方法 HANDLE_REQUEST 里设置断点即可调试:
HTTP 请求发送到后台之后,上述方法会调用一个统一的入口函数 SADT_REST_RFC_ENDPOINT, 该函数和 ADT 后台框架其他处理逻辑的交互如下图所示:
在 ADT 里对 ABAP 源代码做语法检查,实际上就是把整段代码做一个 Base64 编码,然后通过 HTTP Post 发送到后台,由后台执行对应的检查函数,结果通过 HTTP 响应返回给 ADT 前端。
相应的,如果对ADT的前台 Java 代码感兴趣,请移步 ADT 安装目录下的 plugins 文件夹,把里面的 jar 包反编译出来阅读源代码即可。
2. SAP GUI 和 ADT的 关系
一言以蔽之:二者互为补充。
一方面,对于S/4HANA很多新功能的开发,比如 CDS view 和 AMDP(ABAP Managed Database Procedure), 开发人员没有选择的余地,必须使用 ADT,因为 SAP GUI 不支持这些新功能的开发。
比如在 SAP GUI 里即使想浏览 CDS view 的内容也不行,会收到提示:
Please use the ADT Tools in Eclipse to process DDL sources.
而 AMDP,就是一个特殊的 ABAP 类,能够在 ABAP 方法里执行 HANA 的SQLScript 或者存储过程。
SAP GUI 里可以查看 AMDP 的源代码,但是没法做开发。试图在 SAP GUI 里进行编辑时,会遇到上面的提示信息:
Class XX contains stored procedures which cannot be changed in SAP GUI
反之,SAP GUI 里一些比较传统的开发,ADT 也是不支持的。举一些例子。
传统 Dynpro 程序的 Screen 开发,双击 Screen number,就可以通过点击Layout 按钮打开 Screen Painter,然后进行所见即所得的 Screen 布局开发:
然而如果在ADT里试图编辑这个Screen会发生什么事?
ADT 会打开一个新的标签页,里面显示一个嵌入的 SAP GUI 窗口,像 Screen Painter 和其他一些传统的 ABAP 开发,均在这个嵌入的 SAP GUI 里进行。
使用 SAP GUI 做开发的 ABAP 顾问,应该明白这三个 session 的区别:
- User Session
- ABAP Session
- Internal Session
我们每次用 SAP GUI 登录一个系统,都会产生一个新的 User Session,每个User Session 里用 /o 打开一个新的事务码,则是在该 User Session 里开启了一个新的 ABAP Session.
一个 User Session 默认能打开最多 6 个 ABAP Session,可以通过修改系统参数把最大数目扩充为 16 个。
那么 ADT 里打开的嵌有 SAP GUI 窗口的标签页,背后启动的 Session 类型是什么?答案是 User Session.
下图是 ADT 里打开的两个标签和其对应的两个 User Session,用不同颜色来区分。
3. ADT 和 SAP GUI 相比的一些独到之处
既然是一个基于Eclipse的IDE,ADT 和 SAP GUI 相比还是存在一些独到之处。
第一,由于 ADT 是基于 Eclipse 这个较之 SAP GUI 来说更加现代的 IDE,从使用习惯上来说更贴近 Java/C++ 程序员。
以 ABAP 类为例,各个维度的信息在 ADT 里能在一个屏幕里同时显示,在 SAP GUI 里一个屏幕显示的信息维度很单一。
如果想看其他维度信息,只有通过双击的方式跳转,查看完毕后通过回退键回到正在工作的界面。
又比如所有添加了关注的系统的 ST22 信息能在一个地方统一监控了:
第二,ADT 提供了很多代码重构的向导(Assistant), Java 和 C++ 的开发人员对这些类的重构功能一定不会陌生。
一些常用的代码重构功能如下:
- Delete unused variables:
快速删除一个方法里所有定义了但未使用的局部变量,这个功能很实用,SAP GUI 不支持。
- Extract Methods: 如果一段代码反复出现,可以考虑用重构技术里的方法提取,将其封装成一个方法。
当然还在使用 SAP GUI 的开发人员要使用 ABAP 重构向导也是可以的, 根据SAP GUI 版本的不同, 入口也稍有差异。
在 SAP GUI 740 版本里,重构向导通过 Utilities 菜单进入。
740 之前的版本,重构向导的打开方式大同小异:
第三,对 SAP GUI 一些常用功能的原生支持。
所谓原生支持,指用 Eclipse 原生的页面来提供以前在 SAP GUI 里实现的功能。
对 ABAP 开发顾问来说,几乎每天都要在 SAP GUI 进行的操作就是 ABAP 类和报表的调试。
有的以前从事 Java 开发的朋友们转到 SAP GUI 后,刚上手时使用 SAP GUI 的调试器总觉得很别扭。一旦使用 ADT 的调试器,熟悉的味道又回来了。在 ADT里调试 ABAP 和 Eclipse 里调试 Java 程序的方式完全一致。
SAP GUI 里的单元测试和分支/语句执行覆盖率:
ADT 里也提供了单元测试和各种覆盖率审查的原生支持:
SAP GUI 里的事务码 SAT 在 ADT 里的原生支持:
使用方式和 SAP GUI 里的没有差别。
第四,方便的SQL console功能。
以前在 SAP GUI 里时,有时出于测试目的想写些简单的 SQL 语言做些验证,还得创建一个报表然后在报表里书写。在 ADT 里,直接使用 SQL console 就可省去不必要的报表创建:
第五,改进的代码版本比较功能。
有些朋友反映 SAP GUI 里自带的代码比较工具不是很好用:
如今在 ADT 里,ABAP 开发人员终于可以像 Java 程序员一样,享受 Eclipse 提供的便利的代码版本比较功能了:
4. ADT 其他一些值得一提的小功能
- ADT Link
比如任何一个在 ADT 里能够查看的资源,都有一个所谓的 ADT Link,通过菜单 Share Link 查看:
这种Link格式如下:
adt://AG3/sap/bc/adt/vit/wb/object_type/tabldt/object_name/ZORDER
通过 Open ADT Link 菜单,输入上述 ADT Link,能直接打开对应的资源,而不需要像 SAP GUI 那样,需要先运行正确的事务码,进入事务码之后再打开资源。
- 自定义编辑器颜色
如何才能让自己使用的 IDE 和其他程序猿相比显得与众不同呢?一个办法是个性化字体和背景色。比如字体必须用程序猿专用的等宽开源字体 Inconsolata:
SAP GUI 的颜色个性化设置稍显麻烦,需要一项项手动设置。而 ADT 因为是基于 Eclipse,所以主题的个性化就容易多了。如果觉得下面的 dark 主题还不够酷,
安装一个名叫 Eclipse Color Theme 的插件,就可以使用这个插件预置好的几十套主题,真正做到一年 54 周每周换一套 Theme 了。
总结
作为一个拥有 14 年 ABAP 开发经验的老程序员,在笔者心中 SAP GUI 和 Eclipse 都是优秀的 ABAP IDE,各有其长处和适应场合。本文通过逐一将 SAP GUI 和 ADT 提供的开发特性做横向比较,希望能够帮助开发人员感知到这些年的集成开发环境自身随时代发展而持续演进,提高,不断改善开发人员使用体验的发展方向。
祝每一位 ABAP 开发人员都能愉快地使用 SAP GUI 和 ADT,做到得心应手。感谢阅读。