MagicDraw二次开发过程
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报错问题
- 参考资料
帮助文档关键内容
插件是唯一方式。
Plugins are the only one way to change the functionality of a modeling tool.
插件运行过程示意图:
插件管理器会扫描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开发过程
开发准备
通过settings > Appearance & Behavior > Path Variables添加变量
MAGIC_DRAW_INSTALL_DIRECTORY
指向安装目录(便于多人开发时解决各计算机依赖包位置不同的问题);修改配置文件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"
开发流程
创建空项目;
添加
Libraries
,并在Modules
中设置Dependencies
引用;注:Libraries指向MAGIC_DRAW_INSTALL_DIRECTORY\lib整个文件夹,并且需要手动设置递归(否则会出现依赖缺失),在配置文件.idea\libraries\xxx.xml文件下直接手动修改
<jarDirectory url="file://$MAGIC_DRAW_INSTALL_DIRECTORY$/lib" recursive="true" />
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$
创建插件类;
继承
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;} }
创建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插件开发注意事项
必须基于JDK11进行开发,否则编译时会报空指针异常,project lanuage level设置为10;
Modules中按照MagicDraw Patch[安装目录/lib/path.jar]、MagicDradraw Brand[安装目录/lib/brand.jar brand_api.jar]、MagicDraw Libs[安装目录/lib]的顺序设置依赖;
引用其他的依赖,如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包,都需要引入进来。
参考资料
[1] MagicDraw\manual\MagicDraw UserManual.pdf :
Developer Guide
部分[2] java.lang.NoClassDefFoundError
[3] Jar包反编译后修改源码再编译
MagicDraw二次开发过程相关推荐
- 基于python的种子搜索网站(二)开发过程
本讲会对种子搜索网站的开发过程进行详细的讲解. 网站演示: https://bt.mypython.me 源码地址: https://github.com/geeeeeeeek/bt 项目开发过程 项 ...
- 畅捷通二次开发过程的理解
背景:T+是一个强大的财务处理软件,公司购买了T+客户端作为专业的记账软件,同时公司要开发一个计量应用,如果顾这个计量应用里面产生了单据,需要把订单传给T+,由T+进行订单等单据管理,因此需要在畅捷通 ...
- 移远EC200UCN_LA 4G通信模块 OpenCPU二次开发过程中遇到的各种坑
这里主要记录一下我在使用移远开发板进行 EC200UCN_LA 4G通信模块开发中遇到的各种坑. 注: Q为遇到的问题 A为问题的解决办法 T为注意事项 Q. 串口demo无法正常接收和发送 ...
- 什么样的GPS定位系统最适合做二次开发
什么样的GPS定位系统最适合做二次开发呢? 术业有专攻,好比都是汽车,轿车和越野车功能用途不同,如果你跑高速肯定选择轿车跑的平稳舒适:如果你去泥泞沟沟坑坑的道路,跑山过河肯定选择越野车跑得更轻松,底盘 ...
- 基于EasyNVR二次开发实现业务需求:用户、权限、设备管理
许多接触到EasyNVR的用户.开发者都会提出关于EasyNVR设备分组和账户设备关系映射的问题,我们参考目前大部分的视频能力输出平台的做法,EasyNVR目前只做了唯一的用户/密码(类比appkey ...
- xml模块、项目开发过程
一.XML模块 xml指的是可扩展标记语言,是一种定义电子文档结构和描述的语言,可以用来标记数据.定义数据类型. 什么时候用xml? 当需要自定义文档结构时,使用xml.在java中经常会使用xml来 ...
- Excel 二次开发系列(3): 创建Excel二次开发环境
Excel 二次开发系列 前面我们讲到了 Excel编程模型及Excel 常用操作方法,在这一节,我说一下基础的怎么创建一个Excel应用级的二次开发程序. 在微软的这个基础网站里面可以找到很多的有用 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】二.架构和组成部分
1.1 架构结构图 1.1.1 层次示意图 1.1.2 模型对象示意图 1.2 IO管理器 IO管理器是对串口和网络通讯链路的管理.调度.针对串口和网络通讯链路的特点,在IO管 ...
- UG NX二次开发(C#)-建模-获取曲面的法矢
文章目录 1.前言 2.曲面的法矢示例 3.获取曲面的法矢 3.1 采用 uFModl.AskFaceProps实现 3.2采用 uFSo实现 4.结论 1.前言 在UG NX二次开发过程中,我们想获 ...
- 基于 Golang 的 K8s 二次开发细节汇总
前情提要 针对 K8s 进行二次开发设计时,通常会采用 kubebuilder & client-go 的方式进行远程调用,通过 golang 进行开发时,往往需要基于项目实现部分业务逻辑通过 ...
最新文章
- android onNewIntent 为什么要在onNewIntent的时候要显示的去调用setIntent
- .net 提供不通过反射访问不同数据库吗?
- Python 多线程抓取网页
- 传统BI为什么注定会失败?
- HTML / img src 使用绝对路径注意事项
- 一文解开java中字符串编码的小秘密
- discuz x2.5 广告位开发学习(第二步:制作)
- linux远程登录ssh免密码
- MyEclipse软件中快捷键
- Dotnet Core
- puppet 安装mysql_Puppet安装dashboard
- 《虚拟化与云计算》读书感(九)服务器虚拟化的其他核心技术
- Atitit.获取swing ui 按钮控件的id 与名字 与JPDA 调试体系
- v8引擎编译全记录2020-10-17(保姆级教程)
- 微信开放平台开发第三方授权登陆(一):开发前期准备
- python字符串介绍_python字符串详解
- Dreamwear如何创建javascript_内存管理+如何处理4种常见的内存泄漏
- 判断当前手机设备的类型(安卓还是IOS)
- #超全#行人重识别数据集整理,附下载链接和介绍
- 2019该怎么学unity3D游戏开发?