MagicDraw二次开发过程

文章目录

  • MagicDraw二次开发过程
    • 帮助文档关键内容
    • 插件开发流程
      • 1. 在plugins文件夹下创建插件文件夹
      • 2. 编写插件代码
      • 3. 编译并打包成*.jar*文件[3](#refer-anchor-1)
      • 4. 编写描述文件*plugin.xml*
    • IDEA开发过程
      • 开发准备
      • 开发流程
      • 开发问题
        • 1. ClassNotFoundException
        • 2. 仿真事件监听问题
        • 3. MagicDraw Systems of Systems Architect 2021X插件开发注意事项
        • 4. 调试时出现多个版本的插件
        • 5. 调试时的插件依赖问题与MagicDraw报错问题
    • 参考资料

帮助文档关键内容

  1. 插件是唯一方式。

    Plugins are the only one way to change the functionality of a modeling tool.

  2. 插件运行过程示意图:

    插件管理器会扫描plugins下所有文件夹,文件夹内需要有插件描述文件,根据文件中的描述找到插件类,判断是否继承com.nomagic.magicdraw.plugins.Plugin,并实现了init()方法。

插件开发流程

1. 在plugins文件夹下创建插件文件夹

2. 编写插件代码

注:必须有一个类继承com.nomagic.magicdraw.plugins.Plugin

The plugin must contain at least one class derived from the com.nomagic.magicdraw.plugins.Plugin class.

3. 编译并打包成*.jar*文件3

4. 编写描述文件plugin.xml

IDEA开发过程

开发准备

  1. 通过settings > Appearance & Behavior > Path Variables添加变量MAGIC_DRAW_INSTALL_DIRECTORY指向安装目录(便于多人开发时解决各计算机依赖包位置不同的问题);

  2. 修改配置文件MagicDraw\bin\magicdraw.properties,在JAVA_ARGS添加属性

    -Dmd.plugins.dir="absolute path to plugins directory1;absolute path to
    plugins directory2"
    

    目录直接写当前正在开发插件目录,这样启动MagicDraw后会到该目录加载插件(经过测试发现不修改配置,在启动IDEA调试后MagicDraw也可以加载插件);

    注:在.properties中需要使用转义字符,否则会导致配置不生效,所有插件丢失,示例如下

    -Dmd.plugins.dir\="\C:\\Program Files\\MagicDraw\\plugins;D\:\\09_Project\\Simulation\\SYSML\\ide\\intellij\\MagicDraw development\\plugins"
    

开发流程

  1. 创建空项目;

  2. 添加Libraries,并在Modules中设置Dependencies引用;

    注:Libraries指向MAGIC_DRAW_INSTALL_DIRECTORY\lib整个文件夹,并且需要手动设置递归(否则会出现依赖缺失),在配置文件.idea\libraries\xxx.xml文件下直接手动修改

    <jarDirectory url="file://$MAGIC_DRAW_INSTALL_DIRECTORY$/lib" recursive="true" />
    
  3. Edit Configurations;

    具体参数如下:

    MagicDraw with all plugins-Xmx2000M
    -Xss1024K
    -XX:PermSize=60M
    -XX:MaxPermSize=200M
    -DLOCALCONFIG=true
    -Dmd.plugins.dir=${MAGIC_DRAW_INSTALL_DIRECTORY}/plugins;..
    "-javaagent:${MAGIC_DRAW_INSTALL_DIRECTORY}/openapi/ide/lib/com.nomagic.magicdraw.intellij.launcher.jar"
    -jar
    "${MAGIC_DRAW_INSTALL_DIRECTORY}/openapi/ide/lib/com.nomagic.magicdraw.intellij.launcher.jar"com.nomagic.magicdraw.LaunchGateway-verbose$MODULE_DIR$
    
  4. 创建插件类;

    继承com.nomagic.magicdraw.plugins.Plugin,并实现init()close()isSupported()方法。

    package simulation;import com.nomagic.magicdraw.core.Application;
    import com.nomagic.magicdraw.plugins.Plugin;/*** 插件*/
    public class SimulationPlugin extends Plugin {public static boolean initialized;@Overridepublic void init(){initialized = true;Application.getInstance().getGUILog().showMessage("Simulation plugin initialized.");}@Overridepublic boolean close(){return true;}@Overridepublic boolean isSupported(){return true;}
    }
  5. 创建plugin.xml;

    src同级目录下创建。

    <?xml version="1.0" encoding="UTF-8"?>
    <pluginid="SimulationPlugin"name="SimulationPlugin"version="1.0"provider-name="SYSWARE"class="simulation.SimulationPlugin"><requires><api version="1.2"/></requires><runtime><library name="SimulationPlugin.jar"/></runtime>
    </plugin>
    

开发问题

1. ClassNotFoundException

引用MagicDraw\lib\bundles下的某些jar包时,编译没有问题,但是插件运行时报错,如Caused by: java.lang.ClassNotFoundException: org.json.JSONObject

报错信息:

2019-10-16 16:36:09,996 [main] ERROR PLUGINS - Can not start plugin My Plug-in 1
java.lang.NoClassDefFoundError: org/json/JSONObjectat myplugin1.MyPlugin1.init(MyPlugin1.java:17)at com.nomagic.magicdraw.plugins.d.b(d.java:719)at com.nomagic.magicdraw.plugins.d.a(d.java:556)at com.nomagic.magicdraw.plugins.d.y(d.java:487)at com.nomagic.magicdraw.core.h.t(h.java:45)at com.nomagic.rcpf.product.o.a(o.java:283)at com.nomagic.rcpf.product.p.b(p.java:93)at com.nomagic.rcpf.product.p.a(p.java:77)at com.nomagic.magicdraw.core.Application.internalStart(Application.java:685)at com.nomagic.magicdraw.core.Application.start(Application.java:454)at com.nomagic.magicdraw.MagicDrawApplicationLauncher.launch(MagicDrawApplicationLauncher.java:24)at com.nomagic.magicdraw.ApplicationGateway.start(ApplicationGateway.java:46)at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:388)at com.nomagic.osgi.launcher.FrameworkLauncher$DefaultApplication.run(FrameworkLauncher.java:227)at com.nomagic.osgi.launcher.FrameworkLauncher.runFrameworkApplication(FrameworkLauncher.java:177)at com.nomagic.osgi.launcher.FrameworkLauncher.run(FrameworkLauncher.java:114)at com.nomagic.osgi.launcher.FrameworkLauncher.run(FrameworkLauncher.java:93)at com.nomagic.osgi.launcher.ProductionFrameworkLauncher.run(ProductionFrameworkLauncher.java:66)at com.nomagic.osgi.launcher.ProductionFrameworkLauncher.main(ProductionFrameworkLauncher.java:53)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:498)at com.nomagic.launcher.Launcher.startMainClass(Launcher.java:337)at com.nomagic.launcher.Launcher.start(Launcher.java:108)at com.nomagic.launcher.Launcher.main(Launcher.java:70)
Caused by: java.lang.ClassNotFoundException: org.json.JSONObjectat java.net.URLClassLoader.findClass(URLClassLoader.java:382)at java.lang.ClassLoader.loadClass(ClassLoader.java:424)at java.lang.ClassLoader.loadClass(ClassLoader.java:357)... 29 more

解决方案:

在plugin.xml同级目录下创建lib文件夹,将引用的jar包复制到该目录下,同时在Project Structure/Libraries下添加lib目录,并将顺序调到最高,然后在plugin.xml中添加runtime>library引用

截图如下:

<?xml version="1.0" encoding="UTF-8"?>
<pluginid="myplugin1"name="My Plug-in 1"version="1.0"ownClassloader="true"provider-name="No Magic"class="myplugin1.MyPlugin1"><runtime><library name="lib/org.json_1.0.0.255610281323.jar"/><library name="myplugin1.jar"/></runtime>
</plugin>

2. 仿真事件监听问题

需要在仿真开始前注册监听器,否则监听回调函数没有作用。

自定义监听类:CustomSimulationExecutionListener

import com.nomagic.magicdraw.simulation.execution.SimulationExecutionListener;
import com.nomagic.magicdraw.simulation.fuml.data.i;
import fUML.Semantics.CommonBehaviors.Communications.SignalInstance;public class CustomSimulationExecutionListener extends SimulationExecutionListener {@Overridepublic void eventTriggered(SignalInstance signal){i data = signal.getData();System.out.println("监听到信号被触发");}
}

注册监听器:MainAction

    @Overridepublic void actionPerformed(ActionEvent e){// TODO: 监听仿真过程中的事件CustomSimulationExecutionListener executionListener = new CustomSimulationExecutionListener();SimulationManager.registerSimulationExecutionListener(executionListener);// ...开始仿真等操作}

3. MagicDraw Systems of Systems Architect 2021X插件开发注意事项

  1. 必须基于JDK11进行开发,否则编译时会报空指针异常,project lanuage level设置为10;

  2. Modules中按照MagicDraw Patch[安装目录/lib/path.jar]、MagicDradraw Brand[安装目录/lib/brand.jar brand_api.jar]、MagicDraw Libs[安装目录/lib]的顺序设置依赖;

  3. 引用其他的依赖,如simulation.jar,需要在发布时在plugin.xml中制指定runtime/library/name设置具体位置,否则会出现开发环境下正常,但是发布后找不到类而加载失败的情况;
    特殊情况:通过plugin.xml设置依赖simulation.jar后,造成活动图的decision、状态图的choice在仿真过程中突然中断,需要通过插件依赖的方式设置依赖。

<?xml version="1.0" encoding="UTF-8"?>
<pluginid="MatlabEngine"name="Matlab Engine"version="19.0 SP3"internalVersion="1900010"provider-name="No Magic"class="com.nomagic.magicdraw.simulation.matlab.MatlabPlugin"><requires><api version="1.0"/><required-plugin id="SimulationToolkit" name="Cameo Simulation Toolkit" version="19.0 SP3" internalVersion="1900010"/></requires><runtime><library name="matlab_api.jar"/><library name="lib/jmatengine.jar"/></runtime>
</plugin>

4. 调试时出现多个版本的插件

当使用IDEA进行调试开发时,可能会在enviroment/plugins下面出现多个版本的同一插件,原因是设置的启动配置中:

-Dmd.plugins.dir=${MAGIC_DRAW_INSTALL_DIRECTORY}/plugins;..

MagicDraw会到安装目录下的plugins文件夹以及当前项目的上级目录寻找所有的plugin.xml文件,然后加载对应插件,如果有多个版本的plugin.xml就会造成插件多次加载。

5. 调试时的插件依赖问题与MagicDraw报错问题

当正在开始的插件依赖于其他插件时,通常需要在Modules/Dependencies下设置依赖的jar包,部署发布时需要在plugin.xml中设置requires对插件的依赖。

有时会出现问题:部署发布后,插件以及MagicDraw都没有问题;但是开发调试过程中,MagicDraw本身功能却出现问题,如原本的仿真功能菜单为Run,当开发插件依赖仿真插件时,菜单变成了CONTEXT_TOOLBAR

原因在于:发布后的插件,由于已经在plugin.xml中设置了插件依赖关系,MagicDraw软件本身会解决依赖问题;调试中的插件,虽然引用了所依赖插件的jar包,但是并没有把其下的所有jar包引进来,还可能是所依赖的插件本身又依赖于另一个插件,这些jar包都要包含进来。

开发过程中需要保证所有依赖的插件及依赖插件的父插件目录下的jar包,都需要引入进来。

参考资料

MagicDraw二次开发过程相关推荐

  1. 基于python的种子搜索网站(二)开发过程

    本讲会对种子搜索网站的开发过程进行详细的讲解. 网站演示: https://bt.mypython.me 源码地址: https://github.com/geeeeeeeek/bt 项目开发过程 项 ...

  2. 畅捷通二次开发过程的理解

    背景:T+是一个强大的财务处理软件,公司购买了T+客户端作为专业的记账软件,同时公司要开发一个计量应用,如果顾这个计量应用里面产生了单据,需要把订单传给T+,由T+进行订单等单据管理,因此需要在畅捷通 ...

  3. 移远EC200UCN_LA 4G通信模块 OpenCPU二次开发过程中遇到的各种坑

    这里主要记录一下我在使用移远开发板进行 EC200UCN_LA 4G通信模块开发中遇到的各种坑. 注: Q为遇到的问题    A为问题的解决办法   T为注意事项 Q. 串口demo无法正常接收和发送 ...

  4. 什么样的GPS定位系统最适合做二次开发

    什么样的GPS定位系统最适合做二次开发呢? 术业有专攻,好比都是汽车,轿车和越野车功能用途不同,如果你跑高速肯定选择轿车跑的平稳舒适:如果你去泥泞沟沟坑坑的道路,跑山过河肯定选择越野车跑得更轻松,底盘 ...

  5. 基于EasyNVR二次开发实现业务需求:用户、权限、设备管理

    许多接触到EasyNVR的用户.开发者都会提出关于EasyNVR设备分组和账户设备关系映射的问题,我们参考目前大部分的视频能力输出平台的做法,EasyNVR目前只做了唯一的用户/密码(类比appkey ...

  6. xml模块、项目开发过程

    一.XML模块 xml指的是可扩展标记语言,是一种定义电子文档结构和描述的语言,可以用来标记数据.定义数据类型. 什么时候用xml? 当需要自定义文档结构时,使用xml.在java中经常会使用xml来 ...

  7. Excel 二次开发系列(3): 创建Excel二次开发环境

    Excel 二次开发系列 前面我们讲到了 Excel编程模型及Excel 常用操作方法,在这一节,我说一下基础的怎么创建一个Excel应用级的二次开发程序. 在微软的这个基础网站里面可以找到很多的有用 ...

  8. 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分

    1.1    架构结构图 1.1.1    层次示意图 1.1.2    模型对象示意图 1.2    IO管理器 IO管理器是对串口和网络通讯链路的管理.调度.针对串口和网络通讯链路的特点,在IO管 ...

  9. UG NX二次开发(C#)-建模-获取曲面的法矢

    文章目录 1.前言 2.曲面的法矢示例 3.获取曲面的法矢 3.1 采用 uFModl.AskFaceProps实现 3.2采用 uFSo实现 4.结论 1.前言 在UG NX二次开发过程中,我们想获 ...

  10. 基于 Golang 的 K8s 二次开发细节汇总

    前情提要 针对 K8s 进行二次开发设计时,通常会采用 kubebuilder & client-go 的方式进行远程调用,通过 golang 进行开发时,往往需要基于项目实现部分业务逻辑通过 ...

最新文章

  1. android onNewIntent 为什么要在onNewIntent的时候要显示的去调用setIntent
  2. .net 提供不通过反射访问不同数据库吗?
  3. Python 多线程抓取网页
  4. 传统BI为什么注定会失败?
  5. HTML / img src 使用绝对路径注意事项
  6. 一文解开java中字符串编码的小秘密
  7. discuz x2.5 广告位开发学习(第二步:制作)
  8. linux远程登录ssh免密码
  9. MyEclipse软件中快捷键
  10. Dotnet Core
  11. puppet 安装mysql_Puppet安装dashboard
  12. 《虚拟化与云计算》读书感(九)服务器虚拟化的其他核心技术
  13. Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系
  14. v8引擎编译全记录2020-10-17(保姆级教程)
  15. 微信开放平台开发第三方授权登陆(一):开发前期准备
  16. python字符串介绍_python字符串详解
  17. Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏
  18. 判断当前手机设备的类型(安卓还是IOS)
  19. #超全#行人重识别数据集整理,附下载链接和介绍
  20. 2019该怎么学unity3D游戏开发?

热门文章

  1. 图像基础--图像预处理技术(色彩插值、色彩校正、伽马校正、图像增强和白平衡)
  2. 浅谈声纹识别应用:声音被模仿,声音识别身份可靠吗?
  3. STM32F207时钟系统解析
  4. 数据库注入提权总结(一)
  5. 配置mysql环境变量之后,仍然无法打开mysql的解决方法
  6. 手把手教你自制一寸两寸照
  7. websockets 和 socketio 的比较
  8. 前端H5面试题Js:JavaScript字符串的常用方法有哪些?
  9. 录音文件下载_如何免费下载受版权保护的收费音乐
  10. ECharts学习笔记(1)——使用关系图展示关联分析结果