快速开始
准备工作
获取 Magicdraw 工程的主要依赖。
执行以下 bat 脚本,执行前先设置 MagicLibHome,双击执行后会在当前目录下生成 mainLib.xml
@echo off
setlocal enabledelayedexpansion
REM 设置 MagicLibHome 文件夹路径
set "MagicLibHome=D:\Program Files\Magic Systems of Systems Architect\lib"
REM 遍历 MagicLibHome 中的 jar 文件
for %%f in ("%MagicLibHome%\*.jar") do (
set "fileName=%%~nxf"
set "baseName=%%~nf"
echo ^<dependency^>^<groupId^>com.nomagic^</groupId^>^<artifactId^>!baseName!^</artifactId^>^<version^>1.0.0^</version^>^<scope^>system^</scope^>^<systemPath^>${magicdraw.lib}/!fileName!^</systemPath^>^</dependency^> >> mainLib.xml
)
endlocal新建工程
打开 IDEA,File->New->Project...
Build system选择Maven,JDK使用JDK11。

编辑 pom.xml
在 properties 标签中添加以下内容。
<magicdraw.home>D:/Program Files/Magic Systems of Systems Architect</magicdraw.home>
<magicdraw.lib>${magicdraw.home}/lib</magicdraw.lib>在 dependencies 标签下添加在准备工作中生成的 mainLib.xml 下的内容。
刷新 Maven 的改动,使其加载依赖。刷新后可以在左侧External Libraries中看到加入的依赖。
新建 MainPlugin.java
在 java 下新建 com.atoz.helloworld.MainPlugin。

使其继承com.nomagic.magicdraw.plugins.Plugin。
填充如下内容。
package com.atoz.helloworld;
import com.nomagic.actions.AMConfigurator;
import com.nomagic.actions.ActionsCategory;
import com.nomagic.actions.ActionsManager;
import com.nomagic.magicdraw.actions.ActionsConfiguratorsManager;
import com.nomagic.magicdraw.actions.MDAction;
import com.nomagic.magicdraw.core.Application;
import com.nomagic.magicdraw.plugins.Plugin;
import javax.annotation.CheckForNull;
import java.awt.event.ActionEvent;
public class MainPlugin extends Plugin {
@Override
public void init() {
ActionsConfiguratorsManager configuratorsManager = ActionsConfiguratorsManager.getInstance();
// MainMenu 主菜单
configuratorsManager.addMainMenuConfigurator(new AMConfigurator() {
@Override
public void configure(ActionsManager actionsManager) {
ActionsCategory category = new ActionsCategory(null, "菜单分类");
// 设置折叠菜单
category.setNested(true);
category.addAction(new MDAction(null, "展示 Hello World", null, null) {
@Override
public void actionPerformed(@CheckForNull ActionEvent actionEvent) {
Application.getInstance().getGUILog().showMessage("Hello World!");
}
});
actionsManager.addCategory(category);
}
});
}
@Override
public boolean close() {
return true;
}
@Override
public boolean isSupported() {
return true;
}
}到这里一个简单的插件示例就写好了。
接下来是打包环节。
打包运行
开发者简单打包
在 IDEA 中执行mvn clean package。
在 Magicdraw 安装目录下的 plugins 文件夹中新建 com.atoz.HelloWorld 文件夹。
在文件夹下放入打包产物HelloWorld-1.0-SNAPSHOT.jar。
并在文件夹下新建 plugin.xml,填充以下内容。
- id 为该插件的 id,自己定义。
- name 为插件名称。
- version 为插件版本,建议每次修改代码后都迭代 version。
- class 为插件中继承 Plugin 的类,工具启动的时候会遍历 plugins 文件夹,根据 plugin.xml 里面的 class 执行 init 方法。
- runtime 中填写该插件依赖的 jar,目前该插件只依赖一个 jar。后续会遇到需要 maven 引用多个 jar 的情况,这里暂不讨论。
详情查看官方资料。
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="com.atoz.hello"
name="插件名称"
version="1.0"
provider-name="atoz"
class="com.atoz.helloworld.MainPlugin">
<requires>
<api version="1.2"/>
</requires>
<runtime>
<library name="HelloWorld-1.0-SNAPSHOT.jar"/>
</runtime>
</plugin>到这里插件就已经部署好了,接下来启动 Magicdraw 即可。
启动之后我们可以看到我们定义的菜单。

点击后出现 hello world 弹框。

提交给客户的打包
如果测试了开发者简单打包,可以先删掉 plugins 文件夹下面的com.atoz.HelloWorld,方便这一小节后看效果。
- 在 pom.xml 中新增以下内容。
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<magicdraw.home>D:/Program Files/Magic Systems of Systems Architect</magicdraw.home>
<magicdraw.lib>${magicdraw.home}/lib</magicdraw.lib>
<!-- 打包出来的 jar 文件名称 -->
<jar.name>${project.artifactId}</jar.name>
<!-- 插件的名称 -->
<plugin.name>${project.artifactId}</plugin.name>
<!-- 插件在 plugins 目录下的文件夹名称,同插件 id -->
<plugin.dir>com.atoz.HelloWorld</plugin.dir>
<!-- 插件的继承 Plugin 类的 Class -->
<plugin.mainClass>com.atoz.helloworld.MainPlugin</plugin.mainClass>
<!-- 插件的描述 -->
<plugin.description>打印 Hello world 的弹窗</plugin.description>
<!-- 插件的版本-在 resource/plugin manager 中显示的版本号 -->
<plugin.version.human>1.0</plugin.version.human>
<!-- 内部版本号 -->
<plugin.version.internal>250703</plugin.version.internal>
<!-- 插件该版本发布的时间 -->
<plugin.version.date>25-07-03</plugin.version.date>
</properties>
<build>
<finalName>${jar.name}</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<finalName>${jar.name}-导入-${plugin.version.human}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>${project.basedir}/assembly/assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>在项目根目录下新建
assembly文件夹。在 assembly 目录下新增 3 个文件。
assembly.xml,plugin.xml,MDR_Plugin_{插件名称}_{资源描述id}_descriptor.xml。
资源描述 id 尽量唯一,本文以 71418 为例。
<?xml version="1.0" encoding="UTF-8"?>
<plugin
id="${plugin.dir}"
name="${plugin.name}"
version="${plugin.version.human}"
provider-name="atoz"
class="${plugin.mainClass}">
<requires>
<api version="1.2"/>
</requires>
<runtime>
<library name="${jar.name}.jar"/>
</runtime>
</plugin><?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<resourceDescriptor critical="false" date="${plugin.version.date}"
description="${plugin.description}"
group="atoz" homePage="" id="71418" mdVersionMax="higher" mdVersionMin="17.0"
name="${plugin.name}" product="${plugin.name}" restartMagicdraw="true" type="Plugin">
<version human="${plugin.version.human}" internal="${plugin.version.internal}" resource="${plugin.version.internal}"/>
<provider email="" homePage="" name="atoz"/>
<edition>Reader</edition>
<edition>Community</edition>
<edition>Standard</edition>
<edition>Professional Java</edition>
<edition>Professional C++</edition>
<edition>Professional</edition>
<edition>Architect</edition>
<edition>Enterprise</edition>
<installation>
<!--
Do not use "*.*" !
If a file name includes “*.*”, all defined files will be removed when uninstalling the plugin.
For example, if "samples/*.*" is defined, all files from the “samples” folder will be removed after uninstalling the resource.
-->
<file from="plugins/${plugin.dir}/${jar.name}.jar" to="plugins/${plugin.dir}/${jar.name}.jar"/>
<file from="plugins/${plugin.dir}/plugin.xml" to="plugins/${plugin.dir}/plugin.xml"/>
</installation>
</resourceDescriptor><assembly xmlns="https://maven.apache.org/xsd/assembly-1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="https://maven.apache.org/xsd/assembly-1.1.3 https://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>bin</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>./plugins/${plugin.dir}</outputDirectory>
<useProjectArtifact>false</useProjectArtifact>
</dependencySet>
</dependencySets>
<files>
<file>
<source>${project.basedir}/target/${jar.name}.jar</source>
<outputDirectory>./plugins/${plugin.dir}</outputDirectory>
</file>
<file>
<source>${project.basedir}/assembly/plugin.xml</source>
<outputDirectory>./plugins/${plugin.dir}</outputDirectory>
<filtered>true</filtered>
</file>
<file>
<!-- 这里要改动 -->
<source>${project.basedir}/assembly/MDR_Plugin_HelloWorld_71418_descriptor.xml</source>
<outputDirectory>./data/resourcemanager</outputDirectory>
<filtered>true</filtered>
</file>
</files>
</assembly>此时我们再执行mvn clean package。可以看到在 target 目录下生成了HelloWorld-导入-1.0.zip。
我们先打开 Magicdraw,在主菜单中选择 Help->Resource/Plugin Manager。在弹出的 Dialog 中选择Import按钮,定位到HelloWorld-导入-1.0.zip,确定。成功的话应该会有下面的提示。

关闭 Magicdraw 重新打开,可以看到插件成功生效。
pom 文件中的
maven-assembly-plugin使用assembly.xml,定义了在 package 阶段打包一个 zip 压缩包,将 plugin.xml 与 descriptor.xml 以及打包产物放入 zip 指定结构下。而点击
Import后 Magicdraw 是如何将 zip 导入的,就是 descriptor.xml 做的工作了。详情请查阅官方资料。
引用非 Magicdraw 的依赖,打包时要做的修改
以 Hutool 工具包为例。
我们在 pom.xml 中添加以下依赖。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.16</version>
</dependency>以及代码中使用它。
// MainMenu 主菜单
configuratorsManager.addMainMenuConfigurator(new AMConfigurator() {
@Override
public void configure(ActionsManager actionsManager) {
ActionsCategory category = new ActionsCategory(null, "菜单分类");
// 设置折叠菜单
category.setNested(true);
category.addAction(new MDAction(null, "展示 Hello World", null, null) {
@Override
public void actionPerformed(@CheckForNull ActionEvent actionEvent) {
//通过公历构建
ChineseDate chineseDate = new ChineseDate(DateUtil.parseDate("2020-08-28"));
String cyclicalYMD = chineseDate.getCyclicalYMD();
Application.getInstance().getGUILog().showMessage(cyclicalYMD);
}
});
actionsManager.addCategory(category);
}
});为了让它在 Magicdraw 中正常运行,我们需要在 pom 中的 build->plugins 下添加以下 plugin。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.1.2</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<excludeScope>system</excludeScope>
</configuration>
</execution>
</executions>
</plugin>该 plugin 会在 package 阶段将非 system 的依赖 copy 到 target/lib 目录下。
然后我们执行一次mvn clean package。可以看到 target 目录下多了依赖。

我们将其添加到 descriptor.xml 和 plugin.xml 中。
<installation>
<!--
Do not use "*.*" !
If a file name includes “*.*”, all defined files will be removed when uninstalling the plugin.
For example, if "samples/*.*" is defined, all files from the “samples” folder will be removed after uninstalling the resource.
-->
<file from="plugins/${plugin.dir}/${jar.name}.jar" to="plugins/${plugin.dir}/${jar.name}.jar"/>
<file from="plugins/${plugin.dir}/hutool-all-5.8.16.jar" to="plugins/${plugin.dir}/hutool-all-5.8.16.jar"/>
<file from="plugins/${plugin.dir}/plugin.xml" to="plugins/${plugin.dir}/plugin.xml"/>
</installation><runtime>
<library name="${jar.name}.jar"/>
<library name="hutool-all-5.8.16.jar"/>
</runtime>再次打包mvn clean package。
此时打出来的HelloWorld-导入-1.0.zip再在 Magicdraw 中导入即可。(不导入也可以将 zip 中的 plugins 目录下的插件直接复制到 Magicdraw 根目录 plugins 下也可以简单测试)
可以看到成功使用 hutool。

总之添加依赖后,要执行两次打包,第一次打包查看 target/lib 下的依赖有哪些,并填充 descriptor.xml 和 plugin.xml。第二次打包的产物才是最终的。
引用非 Magicdraw 的依赖,自动收集
当使用 mdcli 脚手架创建工程时,引用依赖会自动收集,不用上述配置。
延展
Magicdraw 根目录/openapi/examples下有很多官方示例插件代码可以学习。