ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ADT树导航:一眼看懂Released API、TIER-1与XCO

ADT树导航:一眼看懂Released API、TIER-1与XCO 刚转 ABAP Cloud 的时候我最不适应的不是语法也不是 RAP 那套新概念而是“打开 ADT 之后我到底该点哪里”。以前写 ABAP树里看到什么都能用SAP 的标准函数、类、表抓到手里就是干但到了 ABAP Cloud 环境下一切都不一样了对象能不能用要看 Released API业务对象要分 TIER-1、TIER-2、TIER-3想查一下代码是否合规还得知道 XCO。这些名词单独拎出来都有官方文档可真放到 ADT 的 Project Tree 里大多数人还是懵的。后来我把 ADT 的树当成一张 ABAP Cloud 的“导航系统”去用才发现这些概念其实没那么玄。树里每个节点、每种对象图标、每个右键菜单都在告诉你这个对象处于什么位置、能不能被你的代码碰。这篇就以我实际项目的体验为线索讲讲怎么把 ADT 的 Tree 用成导航让你一眼看懂 Released API、TIER-1 对象和 XCO 之间的关系。1. 为什么说 ADT 的树是 ABAP Cloud 的“导航系统”1.1 树不是文件列表而是架构剖面很多刚接触云开发的同事还习惯把 Project Explorer 当成“文件浏览器”找包、找类、双击打开完事。这个用法在老 ABAP 世界里问题不大但在 ABAP Cloud 里树其实承担了更多职责——它把“对象类型”和“层级关系”直接摆在你面前了。你新建一个 BTP ABAP 环境项目或者连接 S/4HANA Cloud 项目时Project Explorer 里就是一棵标准的树最上面是项目节点项目下是 Favorite Packages、Local Objects 这类收藏夹展开一个包节点之后下面会按照对象类型自动分组。我大概列一下常见的分组Classes / Interfaces面向对象的源代码对象CDS Views数据模型和接口视图Behavior Definitions / ImplementationsRAP 行为定义与实现Service Definitions / Service BindingsOData 服务定义与绑定Dictionary Objects数据元素、表、结构等底层对象这看起来只是“分类”但实际上它是一条架构剖面。你看一个 CDS 视图出现在树的哪个分组、和哪些对象同组、被哪些服务绑定引用就能快速判断它在整个 ABAP Cloud 分层里属于哪一层。ABAP Cloud 最核心的思想就是“分层干净”业务对象是地基扩展是装修服务和 UI 是门窗。树把这些对象按类型归位其实就是把架构给你画出来了。1.2 把概念挂在节点上记忆就轻松了我接触过很多从传统 ABAP 转 ABAP Cloud 的开发者大家普遍头疼的倒不是新语法而是“边界感”哪些 API 是发布的哪个 BO 是 TIER-1XCO 凭什么可以碰底层对象我的经验是不要先背文档先去点树。你在 ADT 的 Project Explorer 里可以做的操作比你想的要多选中一个包右键可以刷新、比较、搜索树顶部的搜索框支持通配符比如输入*XCO*就能把当前项目里所有名字带 XCO 的对象筛出来双击对象可以直接打开编辑器Outline 视图会同步展开右键某个 CDS 视图选择 Where Used List就能看到谁依赖了它、它又依赖了谁。这些操作加起来就是一套完整的“架构导航”。我在带新人的时候经常会说你先不要急着写代码先把包在树里从头到尾点一遍。点完你自然就知道你接下来要做的东西应该放在哪一层、能依赖谁、不能依赖谁。这比任何架构图都直观。2. Released API在树里找到你的“合法 API 白名单”2.1 什么是 Released APIABAP Cloud 环境里SAP 把开发者能用的 API 做了一个明确的“白名单”也就是 Released API。白名单内的接口、类、CDS 实体、方法你可以放心用白名单外的 SAP 内部对象就算系统里真实存在你也不能直接引用。为什么要这么做为了兼容。云环境里 SAP 想保持核心稳定如果把所有内部对象都开放给你用以后 SAP 一升级你就崩SAP 也没法保证兼容。所以“发布”是一个承诺这些 API 是稳定的SAP 会长期维护。这个思路很好理解但落到 ADT 里就是另一回事了。新手最容易踩的坑就是我在树里明明看到这个类了双击也能打开为什么我写代码引用它的时候ATC 检查报错说“not released”这就是“可见 ≠ 可用”的典型场景。树里能看到是因为系统对象都在但 ABAP Cloud 的开发规则不允许你直接使用非 Released 对象。2.2 ADT 里识别 Released API 的三种方法先说结论判断一个对象是不是 Released API最硬的标准是系统的 API 状态标记不是看名字也不是看包名。在 ADT 里我常用的方法有三个。第一个方法是打开对象后查看其属性。选中树里的类或接口右键 Properties如果这个对象是 SAP 发布的 API属性里会明确标出 API State 为 Released。这个方法最直接。第二个方法是利用 ADT 的代码补全和语法检查。在类编辑器里写代码时如果你尝试引用一个非 Released 对象系统很快会给出错误或者警告提示。尤其是在云项目里ADT 的语法检查集成了不少 ABAP Cloud 的校验逻辑输入对象名的时候你往往就能从错误消息里看到“only released objects can be used”之类的字眼。第三个方法是跑 ATC 检查。右键项目或包运行 ABAP Test Cockpit选择云就绪相关的检查变体。ATC 会把你代码里所有非 Released API 的引用当成错误或警告列出来这是最系统、最适合上线前扫一遍的方案。我给客户做云迁移检查时ATC 结果基本就是翻新旧代码的“判决书”。顺便提醒一句Released API 也有“上下文”的区别。同一个类的不同方法可能一部分 Released一部分没有 Released。你打开类的时候可以在 Outline 里看到方法清单但具体每个方法是否 Released得看 API 状态文档或者在 ABAP 帮助里查。传统 ABAP 开发者习惯“只要类能引用方法就随便调”这个习惯在 ABAP Cloud 里必须改。2.3 在树里建立你的“白名单地图”基于上面的判断方法我建议每个项目都做一次“白名单地图”把你在树里能看到的常用 Released API 记下来分类放在笔记里。比如下面这种整理方式对象类型示例对象用途接口IF_ABAP_AUTH_CS_OBJECT云环境下的权限对象访问CDS 实体I_ProductS/4HANA 产品接口视图XCO APICL_XCO_*对象分析、云检查、传输处理异常类CX_ABAP_NOT_A_TABLE系统异常处理这样当你写新代码时第一反应不是去树里翻 SAP 内部对象而是查自己的白名单笔记。我在项目里甚至把这个整理成了团队的 Wiki 页面新同事上手效率明显高了一大截。3. TIER-1 对象业务承重墙该怎么看3.1 Tier-1、Tier-2、Tier-3 的快速对应再说 TIER-1。ABAP Cloud 开发模型里开发对象按照依赖关系分成多个层级大家最常听说的就是 TIER-1。我习惯用一个通俗的比喻把整个应用比作一栋楼TIER-1 是承重墙和地基TIER-2 是房间里的装修和隔断TIER-3 是门、窗、电梯这些和外界交互的通道。对应到 ABAP Cloud 的具体对象TIER-1核心业务对象层业务对象BO、CDS 数据模型、行为定义等。这些对象保存核心业务逻辑与数据是整个系统的“事实来源”。SAP 标准交付的核心对象大部分属于这一类你用 RAP 创建的自定义业务对象在你的应用范围内也是 TIER-1 的存在。TIER-2扩展层对 TIER-1 做增强或调整的对象比如自定义字段、自定义逻辑、CDS 视图扩展、行为扩展。它们依赖 TIER-1但不能反过来被 TIER-1 依赖。TIER-3消费层服务定义、服务绑定、Fiori UI、报表、API 等。它们把 TIER-1 和 TIER-2 的能力包装出来给用户或其他系统是离用户最近的一层。理解这个分层的关键不是背名字而是搞清楚“依赖方向”。TIER-1 是底层只能依赖 SAP 基础核心不能反过来依赖 TIER-2、TIER-3TIER-3 是顶层可以自由依赖下面所有层。如果一条依赖从底下指到了上面架构就不干净了ATC 和一些架构检查工具会给你变颜色。3.2 从树上看 TIER-1 长什么样在 ADT 树里TIER-1 对象是有“典型长相”的。拿我在 BTP ABAP 环境里做的一个自定义业务对象为例在包节点下展开能看到 Behavior Definition、Behavior Implementation以及对应的 CDS 数据模型视图。这些对象被分组摆在树里你一眼就能看出它们在逻辑上是围绕“一个业务对象”组织的。SAP 标准侧的 TIER-1 也类似。你在连接 S/4HANA Cloud 项目时树里会出现大量的I_开头的 CDS 接口视图比如I_Product、I_SalesOrder、I_BusinessPartner。这些I_开头的接口视图就是 SAP 为你开放的 TIER-1 核心数据模型。做 S/4HANA 扩展开发时你的自定义 CDS 视图和 BO 应该依赖的是这些接口视图而不是直接去依赖底层的透明表或 SAP 内部视图。这一点从树里看节点归属就能验证如果你发现自己的 CDS 视图依赖了一个 SAP 包底下的内部对象ATC 马上会把你揪出来。3.3 用 Where Used 验证分层我在实际项目里判断一个对象属于哪个 Tier很少去看它的文档而是直接依赖分析右键树里的对象选择 Where Used List看这个对象被谁引用再看引用了它的那些对象属于什么类型。举个例子我写了一个自定义业务对象ZRAP_TRAVEL它的 CDS 数据模型定义在 TIER-1。我用 Where Used 一看引用它的基本都是服务定义、投影视图、自定义 UI 相关对象也就是 TIER-3 的消费者。这说明依赖方向是“从上到下”架构正常。如果哪天我在这个 BO 的行为实现里直接引用了一个服务绑定或者调用了某个 Fiori 相关的 API那 Where Used 反过来查就会发现在 TIER-1 里出现了不该出现的向上依赖。这就是架构预警。所以我常说Where Used 这个功能不要只在排查 bug 的时候用平时定架构、做 Code Review 的时候也应该多点点。点一次树胜过硬背十条分层规则。4. XCO藏在 Release 节点中的高级工具箱4.1 XCO 是什么能干什么说完了 Released API 和 TIER-1自然就绕不开 XCO。XCO 是 SAP 在云开发环境里提供的一套 ABAP 库SAP 官方习惯直接叫它 XCO Library。你可以把它理解成一组“面向开发对象的 API 工具箱”它让你能够在 ABAP 代码里以面向对象的方式去读取、分析和操作其他开发对象。XCO 能做的事情很多我列几个我实际用过的场景遍历某个包下的所有对象比如找出所有 CDS 视图、所有类、所有接口读取 CDS 视图的元数据比如它们关联了哪些其他视图分析传输请求和包结构执行云就绪检查检测代码里是否存在对非 Released API 的引用在 CI/CD 流水线里写自定义检查脚本。说白了以前你想在 ABAP 里“分析 ABAP 对象”得用一堆底层的、晦涩的 API甚至要碰内部数据结构。现在 XCO 把这些功能封装好了而且它本身的设计是按语义抽象模型SAM来的读起来像在操作业务对象而不是在抠底层存储。这也是为什么我说它是开发者的“超级工具箱”。4.2 用 XCO 做云就绪检查XCO 里我最常用的类是云就绪检查相关的 API。在传统 ABAP 里你要知道某个包能不能迁到云得在 SE80 里一个个对象翻或者跑各种报表在 ABAP Cloud 里XCO 提供了解析这些信息的入口。一个典型的场景是这样的项目要上线团队想知道当前包ZCLOUD_PACKAGE里有没有对非 Released API 的引用。你可以用 XCO 写一段小工具把包内所有对象拉出来再对每个对象做检查最后输出一份问题清单。示意代码差不多长这样DATA(lo_package) xco_cp_packagefor( ZCLOUD_PACKAGE ). DATA(lt_objects) lo_package-objects-all-get( ).xco_cp_packagefor这个方法就是把包名转换成 XCO 的包对象然后它的objects节点能给出所有对象集合。拿到对象集合之后你可以结合 XCO 的其他类继续分析每个对象的 API 状态。具体方法的调用方式不同版本略有差异建议写的时候以本地 ADT 的代码助手提示为准但思路就是这个思路。在 ADT 树里你也能看到 XCO 的身影。如果你在 Project Explorer 里搜索XCO*会看到一票CL_XCO_*、IF_XCO_*之类的类。它们的 API 状态大多是 Released也就是说你可以放心在自研工具和扩展开发中使用。这其实是一个非常鲜明的例子XCO 不是一个只能看不能碰的神秘黑盒它是被正式发布出来给你使用的标准能力。4.3 XCO 不是万能钥匙不过我得泼一盆冷水XCO 再强大它也是在你允许碰的范围内工作。它不能帮你绕过 ABAP Cloud 的限制更不能通过它去修改 SAP 标准对象、调用非 Released API。我见过有的同事把 XCO 理解成了“云环境里的后门”觉得有了它就能随便访问底层表、改标准 CDS 了。这个理解是有问题的。XCO 给你的是“面向对象地访问开发对象元数据”的能力它的能力边界仍然是 Released 对象和合理扩展范围。换句话说你可以用 XCO 写一个扫描工具去检查非 Released 引用但不能用 XCO 去“豁免”这些引用。架构规则还在那里ATC 照样管着你。试想一下这样的场景你用 XCO 写了一个工具能列出某个包里的所有对象还能判断它们的 API 状态。你把这个工具当成项目里的“合规小助手”自己用没问题但它不能把你代码里对某个 SAP 内部对象的直接引用的错误消掉。真正要改的还是你自己的代码。5. 实战十分钟用树摸清一个 ABAP Cloud 项目5.1 实战步骤讲了这么多概念不如直接走一遍流程。我新接手一个 ABAP Cloud 项目时一般会用前十到二十分钟把项目从树里过一遍快速建立起“架构地图”。操作步骤基本是固定的第一步连接项目并加载树。在 ADT 里 File - New - Other选择 ABAP Project输入 ABAP Cloud 环境的服务 URL等待项目资源管理器加载完成。云项目因为要拉取远端元数据第一次加载可能会慢一点耐心等。第二步把开发包加入收藏。在 Project Explorer 里找到你的目标包右键选择 Add to Favorite Packages。这样你的包就会出现在项目根节点的最上面后续展开、刷新、搜索都方便不用一层层去找。第三步展开包的各类节点。重点看这些分组CDS Views 下有哪些视图Behavior Definitions 下有哪些 BOService Definitions 下有哪些服务。一个节点一个节点点过去心里默默对号入座哪些是 TIER-1哪些是 TIER-2哪些是 TIER-3。第四步用 Where Used 抽查几条关键依赖。比如选中自定义 BO 的 CDS 数据模型右键 Where Used List看引用了它的对象是否集中在服务定义和消费视图等上层。如果发现引用了它的地方出现了同层甚至下级对象就要标记出来重点复查。第五步检查 API 状态。在树里挑几个常见的 SAP 接口视图看 Properties 里的 API 状态顺便在包里搜索*XCO*确认项目里涉及到的 XCO 类确实是 Released API。这一步能帮你建立白名单判断的手感。第六步跑一次 ATC。右键包或项目运行 ABAP Test Cockpit选择云就绪检查变体。如果项目比较大可以把检查范围缩小到当前包。ATC 结果出来后优先看错误级别的条目这些基本都是必须解决的问题。整个过程走完你对一个陌生项目的“建筑蓝图”就有底了哪里是承重墙哪里是装修层哪些通道被堵死了哪些门能走心里都有数。5.2 实操心得这里分享几个我自己的实操体会。第一个体会是云项目的树刷新确实比本地系统慢。以前我在本地 ECC 里建个类F5 一刷马上出现云环境里新建对象之后树不是即时刷新出来的有时候要点一下包节点按 F5 或者右键 Refresh再等几秒。刚开始我不适应老是以为对象没建成后来才发现只是树没刷新。习惯之后我会在新建完对象后主动刷新包节点避免误判。第二个体会是树的搜索框非常好用。Project Explorer 顶部那个搜索框支持*通配符。你输入*Flight*当前项目里所有名字含 Flight 的对象都会列出来。按对象类型分组展示的结果比你在 SE80 里一个个包翻效率高多了。这个功能尤其适合“我知道大概叫什么名但不知道在哪个对象类型里”的场景。第三个体会是路径比名字重要。同一个对象在树里从哪个路径访问往往暗示着它的定位。比如一个 CDS 视图如果出现在某个 SAP 核心包的接口视图分组里那它大概率是 SAP 发布的 TIER-1 数据模型如果它在客户扩展包里很可能是 TIER-2 的扩展视图。路径不同你在代码里对待它的方式就不同。看名字不如看它所在的分组和包路径可靠。6. 常见问题与避坑速查6.1 典型问题表下面这张表是我在实际带项目过程中整理出来的高频问题基本覆盖了新手在 ABAP Cloud 树导航里最常碰到的几种困惑。现象原因解决思路树里能看到 SAP 类但代码引用时报 not released可见不等于可用API 状态不是 Released改用已发布的替代 API查属性里的 API 状态新建对象后树里不显示云环境缓存树没有自动刷新右键包节点 RefreshWhere Used 结果很多但看不出层级没有结合对象类型判断关注“谁引用了它”再看这些对象的类型分层ATC 检查通过上线后仍出问题检查变体没选全或只检查了当前对象调整 ATC 变体扩大到包级/传输请求级检查XCO 代码用了以前的旧类云环境不可用旧 ABAP API 未发布换用 XCO 库提供的发布 API包在 Favorite Packages 里一直显示不出子节点项目还没完全加载耐心等待或者断开重连一次6.2 几个容易踩的深坑第一不要迷信对象的 Z 前缀。客户对象不一定都是 TIER-1也可能是一个挂在 SAP 标准对象上的 TIER-2 扩展反过来SAP 包里的 I_ 开头接口视图才是真正可以放心依赖的 TIER-1。判断分层要看对象类型和依赖关系不能只看前缀。第二不要直接在自定义 BO 里调用服务定义相关的东西。我见过不止一个同事在 RAP 行为实现里想当然地调用CL_HTTP_CLIENT之类的类去访问外部服务。这在老 ABAP 里很正常但在 ABAP Cloud 的 TIER-1 层里直接调用 HTTP 层级的 API会让你的核心业务对象带上不必要的技术依赖。架构层面的做法是外部通信应该放在更上层的服务层或者集成场景里而不是写在 TIER-1 的业务对象代码里。第三XCO 类也有非 Released 的角落。不是说CL_XCO_*就一定全 Released打开具体方法时还是要看 API 状态。我建议是把 ADT 的自动补全和语法检查当成第一道防线把 ATC 当最后一道防线两道防线都过了再谈提交代码。第四树里的依赖关系可以看但最终要以 ATC 为准。有时候 Where Used 因为权限或缓存原因结果不完整你看到一个对象没有依赖就以为它是干净的结果 ATC 一跑全是引用错误。所以我的习惯是树帮我看“大概”ATC 帮我看“精确”两者结合才靠谱。我个人在实际操作中的体会是把 ADT 的树当成导航系统之后很多抽象概念就不再是文档上的名词了。你每点开一个节点就是在看这个系统的分层你每查一次 Where Used就是在做一次架构校验你每跑一次 ATC就是在给代码做一次健康体检。释怀了这些Released API、TIER-1、XCO 就不再是三个孤立的知识点而是同一张地图上的三个坐标。新项目接手时不妨也按这个流程走一遍十分钟摸清结构后面写代码心里踏实得多。
返回列表