☰
Maximo实战指南:从数据库建模到权限控制的全流程开发
2026/11/2 14:13:22 网站建设 项目流程

简介:本资源是一份面向IT运维工程师、资产管理系统实施人员及Maximo初学者的入门级培训文档,聚焦Maximo平台核心配置能力培养,解决企业级资产与工单管理系统的部署与定制化基础问题。文档以Word格式(.doc)单文件呈现,体积5.96MB,内容结构清晰,覆盖数据库配置与属性配置两大核心模块:第一章详述对象建模(含主对象、新建对象、类、级别、持久性)、数据库连接设置及configdb工具使用;第二章深入属性定义机制,包括类型与长度约束、等同属性复用、虚拟字段、缺省值、自动编号及字段绑定类等关键实践要点。所有知识点均配有操作逻辑说明与典型应用场景提示,便于读者边学边练、快速上手系统定制。目前已有254人学习下载,是理解Maximo数据模型底层逻辑、开展二次开发与流程配置的重要参考材料。

1. Maximo基本培训文档:不是说明书,是能直接上手改数据库、搭界面、写后台逻辑的实操手册

你刚接手一个Maximo项目,客户提了三个需求:

  • 要在工单里加一个“维修耗时(小时)”字段,支持小数点后一位;
  • 要新建一个“备件领用申请”应用,带表格+附件+多选弹窗;
  • 还要让这个申请只对某几个站点可见,且审批人只能看到自己负责的那部分数据。

翻遍官方文档,全是概念堆砌;查CSDN博客,代码片段断在关键处,缺类路径、少configdb触发步骤、没权限组绑定细节——最后卡在“保存后数据库没建表”“点击按钮没反应”“授权后还是403”这种玄学现场。

这份《Maximo基本培训.doc》就是为这类场景写的:它不讲“什么是MBO”,而是告诉你新建对象后必须点哪三个按钮才能让数据库真生成testline表;不罗列“域有几种类型”,而是用练习题逼你亲手把YORN字段绑到复选框、再验证前端是否同步显示“是/否”;不空谈“BEAN类作用”,而是给出tablebean中handleButtonEvent()方法里getMboSet().moveTo(0)和fireStructureChanged()的调用顺序——错一步,列表就刷不出来。

它面向的是已经部署好Maximo环境、有WebSphere或Jboss基础、能进Admin Console但还没摸清psdi.mbo.*包体系的一线实施工程师或内部开发。整份文档按真实工作流组织:先动数据库(对象→属性→关系→configdb),再搭界面(控件拖拽→绑定域→签名选项),接着写逻辑(MBO增删改→tablebean事件→后台任务调度),最后锁权限(组→应用授权→对象级限制)。所有操作都落在具体菜单路径、按钮名称、配置项勾选状态上,没有一句“理论上可以……”。

提示:这不是入门扫盲材料。如果你连Maximo登录页都还没见过,建议先完成标准安装验证(确保maximo.ear已部署、maxadmin账号可登录、Database Configuration应用能打开)。本文档默认你已具备该前提。


2. 数据库配置:从新建对象到configdb落地的四步闭环

Maximo的数据库配置不是SQL DDL脚本执行器,而是一套元数据驱动的声明式建模工具。它的核心矛盾在于:你在界面上做的所有改动,只是在内存中修改了对象定义快照,真正的数据库表变更,必须经过configdb这道闸门。跳过它,或者中途失败,就会出现“界面上能看到新字段,但数据库表里没有对应列”的经典翻车。

2.1 新建对象:主对象、持久性、级别三要素必须一次选对

新建对象的操作路径:Database Configuration→ 工具栏New Object按钮 → 输入Name(如TESTLINE)、Description(如测试明细表)。此时关键配置项如下:

配置项可选项必须选择理由血泪经验
Main Object✓ / ✗必须勾选。只有主对象才能被工作流引擎识别,后续若要为TESTLINE建审批流,此处不勾则流程设计器里根本找不到该对象曾有项目因漏勾此选项,导致流程发布后始终无法触发,排查3天才发现对象非主对象
Persistent✓ / ✗必须勾选。不勾选即为虚拟对象(Virtual Object),configdb后数据库无表,也无法持久化数据。业务表99%需勾选某导师演示时故意不勾,结果学员误以为“虚拟对象=临时表”,上线后数据全丢
LevelSYSTEM / ORG / SITE根据业务范围选。若TESTLINE仅限某站点使用,选SITE;若跨组织共享,选ORG;若全系统通用(如ASSET),选SYSTEM。选错会导致后续字段约束报错SITE级对象必须含SITEID和ORGID字段,否则configdb直接失败,错误日志只提示“level validation failed”
# configdb执行命令(Linux环境) cd $MAXIMO_HOME/tools/maximo ./configdb.sh -d DB2 -u maximo -p maximo -s MAXIMO

注意:configdb.sh参数中的-d指定数据库类型(DB2/Oracle/SQLServer),-s是数据库实例名(非URL),务必与maximo.properties中mxe.db.name一致。执行前确认$MAXIMO_HOME已正确设置,且当前用户对tools/maximo目录有执行权限。

2.2 属性配置:类型、等同属性、搜索类型的硬约束

对象建好后,点开Attributes标签页添加字段。以TESTLINE为例,需添加DURATION(维修耗时)字段:

  1. 类型与长度:Type选DECIMAL,Length填10,Scale填1(小数点后1位)。

    为什么不是ALN?因为ALN存文本,无法参与数值计算(如工单总耗时求和);为什么Scale=1?客户明确要求“精确到0.1小时”,Scale=0会强制取整。

  2. 等同属性(Equiv Attribute):若DURATION需与WORKORDER表的ACTUALDURATION保持一致(同类型、同精度),则在此处输入WORKORDER.ACTUALDURATION。

    关键逻辑:等同属性是双向同步的。改WORKORDER.ACTUALDURATION的Scale为2,TESTLINE.DURATION的Scale也会自动变为2。生产环境慎用,避免误触核心表。

  3. 搜索类型(Search Type):必须设为WILDCARD(模糊搜索)或EXACT(精确匹配)。若不设,该字段在应用界面的查询区域将不可见。

    玄学现象:DURATION设为EXACT后,在工单查询页输入5.5能搜到,但输入5搜不到(因数据库存的是5.0)。此时应改用WILDCARD,或前端加LIKE '5.%'处理。

2.3 关系与索引:让关联查询不变成全表扫描

TESTLINE需关联到WORKORDER(工单主表),关系配置路径:Relationships标签页 →New Relationship→ 填写:

  • Relationship Name:TESTLINEWO(命名规则:子表+主表缩写)
  • Parent Object:WORKORDER
  • Child Object:TESTLINE
  • Where Clause:workorderid = :workorderid(注意冒号语法,表示引用父对象字段)

为什么必须写Where Clause?Maximo不自动生成ON条件。漏写会导致关联查询返回笛卡尔积,10万条工单 × 100条明细 = 1000万行,页面直接卡死。

索引配置在Indexes标签页,为TESTLINE的workorderid字段建索引:

  • Index Name:TESTLINE_WOID_IDX
  • Unique: ✗(非唯一索引,因一个工单可有多条明细)
  • Columns: 添加workorderid字段,并设Order为ASC
-- configdb后实际生成的SQL(Oracle示例) CREATE INDEX TESTLINE_WOID_IDX ON TESTLINE (WORKORDERID ASC);

排查技巧:若关联查询极慢,登录数据库执行EXPLAIN PLAN FOR SELECT ... FROM TESTLINE t, WORKORDER w WHERE t.workorderid=w.workorderid,看执行计划是否走索引。未走索引则检查索引名是否含非法字符(如空格)、字段名大小写是否与数据库实际列名一致。

2.4 configdb全流程避坑:从标记到生效的五个关键节点

configdb不是一键执行,而是分阶段校验、生成、执行。以下五步任一失败,都会导致“界面有、库中无”:

现象原因解决
执行configdb.sh后提示No changes to process对象/属性修改后未点击Save,或修改状态未被标记为ADD/CHANGE。检查对象列表右侧Status列,应为Add或Change,而非None返回Database Configuration界面,对目标对象右键 →Save,再刷新列表确认状态已更新
configdb.sh报错ORA-00942: table or view does not exist当前用户maximo无CREATE TABLE权限,或MAXIMO模式下已存在同名表但无DROP权限用DBA账号执行GRANT CREATE TABLE TO maximo; GRANT DROP ANY TABLE TO maximo;,或手动DROP TABLE TESTLINE后再试
configdb成功,但数据库中TESTLINE表无DURATION字段字段添加后未保存,或Status列为None。configdb只处理标记为ADD/CHANGE的属性进入Attributes页,找到DURATION行,确认Status为Add,右键Save,再执行configdb
configdb后TESTLINE表存在,但workorderid字段为NULLABLE=Y关系配置中未勾选Required,导致外键字段允许为空。业务上workorderid必填,必须强制非空编辑关系TESTLINEWO,勾选Required,再执行configdb(会生成ALTER TABLE TESTLINE MODIFY WORKORDERID NOT NULL)
configdb成功,但Maximo应用重启后TESTLINE对象在应用设计器里找不到configdb只更新数据库,未刷新Maximo缓存。需手动清除$MAXIMO_HOME\applications\maximo\businessobjects下的编译文件执行$MAXIMO_HOME\tools\maximo\buildmaximo.bat(Windows)或buildmaximo.sh(Linux),重建businessobject jar

提示:生产环境执行configdb前,务必备份maximo.properties和数据库MAXIMO模式。configdb不可逆,一旦执行,无法回滚到前一版本(除非用数据库备份恢复)。


3. 应用程序设计器:从拖控件到签名选项的完整链路

数据库建完,下一步是让业务用户能看见、能操作这些数据。Maximo的应用程序设计器(Application Designer)不是低代码平台,而是基于XML模板+Java BEAN的混合开发环境。它的核心逻辑是:界面控件(Presentation)绑定数据源(MboSet),数据源由MBO类驱动,而MBO类的行为由签名选项(Signature Options)控制权限。漏掉任一环,轻则功能缺失,重则权限失控。

3.1 控件选用板:哪些控件必须配域,哪些必须写BEAN

Application Designer的控件面板(Control Palette)分两类:

  • 声明式控件(Declarative):如Text Box、Check Box、Table,只需绑定属性(Attribute)和域(Domain),无需写Java代码。
  • 行为式控件(Behavioral):如Pushbutton、Attachments、Help Grid,必须关联BEAN类(如psdi.webclient.beans.pushbutton.PushButtonBean),否则点击无响应。

以TESTLINE应用为例,需添加:

  • 一个Table控件展示明细列表;
  • 一个Pushbutton触发“导出Excel”;
  • 一个Attachments控件上传维修照片。

关键配置:

  • Table的Data Source必须设为TESTLINE(即MboSet名),Table Column的Attribute设为DURATION;
  • Pushbutton的Bean Class填psdi.webclient.beans.pushbutton.PushButtonBean,Method填exportToExcel(需确保该方法在BEAN中已实现);
  • Attachments的Bean Class填psdi.webclient.beans.attachments.AttachmentsBean,Mbo Name填TESTLINE。

为什么Table不写BEAN也能显示?因为Table是声明式控件,其数据加载由框架自动调用getMboSet().execute()完成。而Pushbutton是行为式控件,框架只负责渲染按钮,点击后的逻辑必须由BEAN的handleEvent()方法实现。

3.2 签名选项:权限控制的最终闸门

签名选项(Signature Options)是Maximo权限模型的基石。它不控制“谁能看这个应用”,而是控制“在这个应用里,谁能执行哪个操作”。配置路径:Application Designer→ 选中应用 →Select Action→Signature Options。

以TESTLINE应用为例,需配置:

  • ADDRECORD:允许新增明细;
  • DELETE:允许删除;
  • EXPORT:允许导出;
  • ATTACHFILE:允许上传附件。

关键逻辑:签名选项本身不生效,必须与权限组(Security Group)绑定。例如,给MAINTENANCE组授予TESTLINE应用的ADDRECORD和DELETE权限,该组成员才能新增/删除明细;若未授EXPORT,即使界面上有导出按钮,点击也会提示“Access denied”。

3.3 导入导出应用:跨环境迁移的黄金法则

应用设计完成后,不能直接在生产环境修改,必须通过导入导出。导出路径:Application Designer→Export Application→ 选择TESTLINE→ 保存为TESTLINE.xml。

导入到另一环境(如UAT):

  1. 登录UAT环境的Application Designer;
  2. Import Application→ 选择TESTLINE.xml;
  3. 勾选Overwrite existing application(覆盖同名应用);
  4. 点击Import。

血泪经验:导入失败常见原因有三:① XML中引用的域(如TESTLINE_STATUS)在目标环境不存在,需先导入域;② 应用依赖的MBO类(如psdi.app.testline.TestLineSet)未部署,需先编译打包jar并放入$MAXIMO_HOME\applications\maximo\lib;③ XML中appname="TESTLINE"与目标环境已存在应用名冲突,需先在UAT中Delete Application。

3.4 常见问题排查:界面不显示、按钮无响应、附件上传失败

现象原因解决
TESTLINE应用打开后表格为空,无任何报错Table控件的Data Source未设为TESTLINE,或TESTLINEMboSet未在maximo.properties中注册检查maximo.properties是否有mxe.db.object.TESTLINE=psdi.app.testline.TestLineSet,无则添加并重启服务器
点击Export按钮无反应,浏览器控制台无JS错误Pushbutton的Bean Class未指定,或指定的BEAN类中exportToExcel()方法未实现@Override public void handleEvent()查看$MAXIMO_HOME\applications\maximo\businessobjects\src\psdi\webclient\beans\pushbutton\下对应BEAN,确认方法签名和注解正确
Attachments控件显示“Upload File”,但点击后无文件选择框Attachments控件的Mbo Name填错(如填成TEST而非TESTLINE),或TESTLINE对象未启用附件功能(需在Database Configuration中勾选Allow Attachments)进入Database Configuration→ 找到TESTLINE对象 →Attachments标签页 → 勾选Enable Attachments,再configdb
应用导入后,DURATION字段显示为0.0,无法编辑字段DURATION的Readonly属性在Application Designer中被勾选,或绑定的域(Domain)设置了Readonly规则在Application Designer中双击DURATION字段 →Properties→ 取消勾选Readonly;检查域TESTLINE_DURATION的Default Value是否为0.0,若是则清空

提示:每次修改应用后,务必清除浏览器缓存(Ctrl+F5强制刷新),并检查Maximo日志$MAXIMO_HOME\logs\maximo.log中是否有ERROR级别报错,关键词如NullPointerException、ClassNotFoundException。


4. MBO与BEAN开发:从字段校验到后台任务的代码实操

当标准配置无法满足业务逻辑时(如“维修耗时必须大于0且小于24小时”),就必须写Java代码。Maximo的扩展开发分两层:MBO层(Model)处理数据规则,BEAN层(View)处理界面交互。二者通过MboSet桥接,形成MVC变体。

4.1 MBO类:TestLine的init()与save()校验

TestLine是TESTLINE对象对应的MBO类,继承Mbo。核心方法:

// src/psdi/app/testline/TestLine.java public class TestLine extends Mbo implements TestLineRemote { @Override public void init() throws MXException, RemoteException { super.init(); // 初始化时,若DURATION为空,则设为0.0 if (getDouble("DURATION") == 0.0) { setValue("DURATION", 0.0, NOACCESSCHECK); } } @Override public void save() throws MXException, RemoteException { super.save(); // 保存前校验:DURATION必须>0且<24 double duration = getDouble("DURATION"); if (duration <= 0 || duration >= 24) { throw new MXApplicationException("testline", "DURATION_INVALID", new Object[]{duration}); // 抛出预定义错误,需在maximo.ear中配置资源文件 } } }

参数说明:setValue("DURATION", 0.0, NOACCESSCHECK)中的NOACCESSCHECK跳过权限检查,避免初始化时因字段只读而失败;MXApplicationException的"testline"是资源包名,"DURATION_INVALID"是错误码,需在$MAXIMO_HOME\applications\maximo\resources\maximoresources.jar中定义对应提示语。

4.2 tablebean类:TestLineTableBean的按钮事件处理

TestLineTableBean继承TableBean,处理表格级操作。例如,为“批量审核”按钮写逻辑:

// src/psdi/webclient/benas/testline/TestLineTableBean.java public class TestLineTableBean extends TableBean { @Override public int execute() throws MXException, RemoteException { // 重写execute(),在表格加载前执行 MboSetRemote testLineSet = getMboSet(); testLineSet.setWhere("status='DRAFT'"); // 只加载草稿状态 return super.execute(); } public void approveSelected() throws MXException, RemoteException { // 获取选中行 MboSetRemote selectedSet = getMboSet().getSelection(); for (int i = 0; i < selectedSet.count(); i++) { MboRemote mbo = selectedSet.getMbo(i); mbo.setValue("status", "APPROVED", NOACCESSCHECK); } // 刷新表格 fireStructureChanged(); } }

关键点:fireStructureChanged()必须调用,否则界面不刷新;getSelection()返回的是当前选中行的MboSet副本,修改后需显式调用save()(框架自动处理)。

4.3 后台任务:TestLineCleanupTask的定时清理

需每天凌晨2点清理7天前的草稿明细。后台任务开发三步:

  1. 创建任务类(TestLineCleanupTask.java):
public class TestLineCleanupTask implements ScheduleTask { @Override public void start(TaskSchedule schedule) throws MXException, RemoteException { // 获取TESTLINE MboSet MboSetRemote testLineSet = getMboServer().getMboSet("TESTLINE"); // 设置WHERE条件:草稿且创建时间早于7天 Calendar cal = Calendar.getInstance(); cal.add(Calendar.DAY_OF_YEAR, -7); String where = "status='DRAFT' AND createddate < '" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(cal.getTime()) + "'"; testLineSet.setWhere(where); testLineSet.reset(); // 删除所有匹配记录 while (testLineSet.count() > 0) { testLineSet.getMbo(0).delete(); } testLineSet.save(); } }
  1. 在maximo.properties中注册:
mxe.scheduler.task.TestLineCleanupTask=psdi.app.testline.TestLineCleanupTask
  1. 在Cron Task Setup应用中创建实例:
  • Task Name:TESTLINECLEANUP
  • Class Name:TestLineCleanupTask
  • Cron Expression:0 0 2 * * ?(每天2点)
  • Active: ✓

注意:Cron Expression格式为秒 分 时 日 月 周 年,Maximo不支持年字段,填?即可;Active必须勾选,否则任务不启动。

4.4 MBO与BEAN联调避坑:数据不同步、方法不触发

现象原因解决
TestLine的save()方法未执行,数据直接入库TestLine类未在maximo.properties中注册,或TESTLINE对象的Class字段未指向该类检查maximo.properties是否有mxe.db.object.TESTLINE=psdi.app.testline.TestLine,并在Database Configuration中确认TESTLINE对象的Class字段值为此字符串
TestLineTableBean的approveSelected()方法抛NullPointerExceptiongetMboSet()返回null,因TableBean未正确绑定到TESTLINE数据源在Application Designer中,选中Table控件 →Properties→Data Source必须为TESTLINE,且TESTLINEMboSet已在maximo.properties中注册
后台任务执行后,日志显示0 records deleted,但数据库中有草稿数据Cron Expression时区错误(Maximo默认UTC,服务器为CST),或createddate字段类型为DATETIME但WHERE条件用了字符串比较改用setQbe()方法:testLineSet.setQbe("status", "DRAFT"); testLineSet.setQbe("createddate", "<" + cal.getTime());,由框架生成正确SQL

提示:所有自定义Java类必须编译为.class文件,放入$MAXIMO_HOME\applications\maximo\businessobjects\classes,并执行buildmaximo.bat/sh重新打包businessobjects.jar,最后重启应用服务器。


5. 权限与后台任务:从数据隔离到自动化运维的闭环

权限不是“给用户开个账号”,而是构建一张细粒度的访问控制网;后台任务也不是“写个定时脚本”,而是嵌入Maximo生命周期的可靠服务。二者结合,才能实现“某站点人员只能看本站点工单,且每日自动归档历史数据”的生产级需求。

5.1 权限组与数据限制:对象级与属性级的双重锁

MAINTENANCE权限组需限制TESTLINE数据:

  1. 对象限制(Object Restriction):

    • 进入Security Groups→MAINTENANCE→Data Restrictions→Add Row;
    • Object:TESTLINE;
    • Where Clause:siteid = :USERINFO.SITEID(动态获取当前用户所在站点)。
  2. 属性限制(Attribute Restriction):

    • 同一页面 →Attribute Restrictions→Add Row;
    • Object:TESTLINE;
    • Attribute:DURATION;
    • Restriction:READONLY(仅查看,不可编辑)。

关键逻辑:Where Clause中的:USERINFO.SITEID是Maximo内置变量,自动替换为当前用户PERSON记录中的SITEID值。若用户无SITEID(如超级管理员),该限制不生效,符合“管理员全局可见”预期。

5.2 后台任务实例化:从配置到监控的完整链路

TESTLINECLEANUP任务创建后,需验证其可靠性:

  1. 手动触发测试:

    • 进入Cron Task Setup→ 找到TESTLINECLEANUP→Action→Run Now;
    • 查看$MAXIMO_HOME\logs\maximo.log,搜索TESTLINECLEANUP,确认有Deleted X records日志。
  2. 监控任务状态:

    • 进入Cron Task Status应用,筛选Task Name = TESTLINECLEANUP;
    • 关键字段:Last Run Time(最后执行时间)、Next Run Time(下次执行时间)、Status(ACTIVE/INACTIVE)。
  3. 失败告警配置:

    • 在Cron Task Setup中,勾选Send Email on Failure;
    • Email Address: 运维邮箱;
    • Failure Threshold:1(失败1次即发邮件)。

血泪经验:曾有任务因TestLineCleanupTask中getMboServer()返回null而失败,原因是未在构造函数中调用super()。正确写法:

public class TestLineCleanupTask implements ScheduleTask { private MboServerRemote mboServer; @Override public void start(TaskSchedule schedule) throws MXException, RemoteException { this.mboServer = schedule.getMboServer(); // 后续用this.mboServer.get...替代getMboServer() } }

5.3 权限与任务协同:确保自动化不越权

后台任务以MAXADMIN身份运行,不受用户权限组限制。这意味着TESTLINECLEANUP能删除所有草稿,无论siteid为何值。若需按站点清理,必须在任务代码中显式加入权限判断:

public void start(TaskSchedule schedule) throws MXException, RemoteException { MboServerRemote mboServer = schedule.getMboServer(); // 获取所有活跃站点 MboSetRemote siteSet = mboServer.getMboSet("SITE"); siteSet.setWhere("status='ACTIVE'"); siteSet.reset(); for (int i = 0; i < siteSet.count(); i++) { MboRemote site = siteSet.getMbo(i); String siteId = site.getString("SITEID"); // 为每个站点清理其草稿 MboSetRemote testLineSet = mboServer.getMboSet("TESTLINE"); testLineSet.setWhere("siteid = '" + siteId + "' AND status='DRAFT' AND createddate < '" + cal.getTime() + "'"); testLineSet.reset(); // ... 删除逻辑 } }

为什么必须这样写?因为Where Clause中的:USERINFO.SITEID在后台任务中无意义(无用户上下文),必须硬编码或动态枚举站点。

5.4 生产环境终极检查清单

在将TESTLINE方案上线前,我强制自己走一遍以下10步,少一步都可能引发P1故障:

步骤操作验证方式不通过后果
1TESTLINE对象configdb成功,数据库中TESTLINE表存在且含DURATION字段SELECT * FROM TESTLINE WHERE ROWNUM=1应用打开即报错MboSet not found
2TESTLINEMboSet在maximo.properties中注册检查文件是否存在mxe.db.object.TESTLINE=行自定义MBO逻辑不执行
3TESTLINE应用在Application Designer中导出为XML文件大小>1KB,且含<appname>TESTLINE</appname>跨环境迁移失败
4TESTLINE应用导入UAT后,能正常打开并显示表格浏览器无JS错误,表格有数据界面白屏
5DURATION字段在应用中可编辑、可保存输入5.5→ 保存 → 刷新后仍显示5.5业务数据无法录入
6MAINTENANCE组成员登录后,TESTLINE表格只显示本站点数据创建两条TESTLINE记录,siteid分别为SITEA和SITEB,用SITEA用户登录只看到一条数据泄露风险
7TESTLINECLEANUP任务手动触发后,日志显示删除记录数grep "TESTLINECLEANUP" maximo.log | tail -5历史数据堆积,磁盘爆满
8TESTLINE应用的Export按钮点击后生成Excel文件下载文件,用Excel打开,内容与表格一致用户投诉“导出功能失效”
9Attachments控件上传文件后,在Document应用中可查到进入Documents→Find Documents→Owner = TESTLINE维修证据无法追溯
10所有自定义Java类编译无警告,buildmaximo成功$MAXIMO_HOME\applications\maximo\businessobjects\classes\psdi\app\testline\TestLine.class存在服务器启动失败

从那以后我每次上线新功能,都强制走一遍这10步——不是信不过自己写的代码,而是信不过那个以为“这次肯定没问题”的自己。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询