Skip to content

快速开始

准备工作

获取 Magicdraw 工程的主要依赖。

执行以下 bat 脚本,执行前先设置 MagicLibHome,双击执行后会在当前目录下生成 mainLib.xml

bat
@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选择MavenJDK使用JDK11

编辑 pom.xml

在 properties 标签中添加以下内容。

xml
<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

填充如下内容。

java
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
<?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,方便这一小节后看效果。

  1. 在 pom.xml 中新增以下内容。
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>
  1. 在项目根目录下新建assembly文件夹。

  2. 在 assembly 目录下新增 3 个文件。assembly.xmlplugin.xmlMDR_Plugin_{插件名称}_{资源描述id}_descriptor.xml

资源描述 id 尽量唯一,本文以 71418 为例。

xml
<?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
<?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>
xml
<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 中添加以下依赖。

xml
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.8.16</version>
</dependency>

以及代码中使用它。

java
// 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。

xml
<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 中。

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>
xml
<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下有很多官方示例插件代码可以学习。

在线 JavaDoc 2022x 版本

MagicDraw OpenAPI UserGuide