当我使用 Java API 从插件打印时,IBM Rhapsody 日志为空

IBM Rhapsody Log is empty when I print from plugin using Java API

我尝试制作我的第一个 Rhapsody 插件,到目前为止我设法使该插件出现在“工具”选项卡下。

到目前为止我在我的项目中写了这个,但是日志选项卡保持不变

    @Override
public void RhpPluginInit(IRPApplication rpyApplication) {
    IRPApplication rpy = RhapsodyAppServer.getActiveRhapsodyApplication();
    rpy.writeToOutputWindow("Log", "test\n");

}

我的 .hep 文件如下所示

MyPluginProfile.hep:

[Helpers]
numberOfElements=2
name1=MyPlugin
JavaMainClass1=Pack.MyPlugin
JavaClassPath1=D:\Work\eclipseWS\rhapsodyIntegr
isPlugin1=1
isVisible1=1
DLLServerCompatible1=1

name2=Invoke MySimplePlugin
isPluginCommand2=1
command2=MyPlugin
applicableTo2=ObjectModelDiagram
isVisible2=1
applicableToProfile1=SimplePluginProfile
DLLServerCompatible2=1

然后我从文件 > 项目属性 > 属性选项卡 > 选定的 "View Filtered By "helper"" > Helpers 文件将其导入 Rhapsody。我在那里给出了 MyPluginProfile.hep.

的完整路径

最后,我有两个问题:

  1. 为什么 Rhapsody 的“日志”选项卡中没有打印消息?

  2. 如果我修改消息,我必须重新加载助手才能看到更改吗?如果是,我该如何正确操作?

谢谢, 丹尼尔

丹尼尔, 不要误以为仅仅因为您在 Rhapsody GUI 的“工具”菜单下有一个条目就认为您的插件工作正常。如果 Rhapsody 加载您的插件有任何问题,“工具”菜单中的条目仍会显示,但您的插件仍然可能损坏。排除故障的最佳方法是更新您的 Rhapsody.ini 文件并添加一个条目,告诉 Rhapsody 调试您的插件 activity。在 [General] 部分中,输入以下条目:

[一般] JavaAPILogFile=c:\temp\rhap814.log

然后,重新启动 Rhapsody 并重新加载您的模型。 (顺便说一句,我假设您有一个相应的 .sbs 文件,其名称与您的 .hep 文件的名称匹配,并且您有 "added to model" 该 .sbs 配置文件。)然后查看该日志文件以查看问题可能出在哪里.通常是 class 路径错误。您可以通过两种方式指定插件 .class 文件所在的位置,目录或 jar 文件。您的 hep 文件未在 JavaClasspath1 属性 中指定 .jar 文件,因此我认为它是前者。如果您创建了 .jar 文件,则需要将其附加到 JavaClasspath1 属性 值。

重要提示:一旦你的插件开始工作,删除(或者更好的是通过在前面加上分号“;”来评论)Rhapsody.ini 中的 JavaAPILogFile 条目。否则,您将看到插件性能大约下降 10 倍。另外,检查第二个助手中的 "applicableToProfile1" 条目。那最后应该有一个“2”而不是“1”。

  1. 是的,遗憾的是,每次更改插件代码时,都需要重新启动 Rhapsody。

为了更精确的调试,将此条目添加到 [JVM] 部分的 rhapsody.ini 文件中:

使用 Eclipse 进行调试:

[JVM]
Options=ClassPath,LibPath,MaxHeap,MaxStack,EclipseDebug
EclipseDebug=agentlib:jdwp=transport=dt_socket,address=8000,server=y,suspend=y

或用于 JDB 调试:

Options=ClassPath,LibPath,MaxHeap,MaxStack,JDBDebug
JDBDebug=-agentlib:jdwp=transport=dt_shmem,address=jdbconn,server=y,suspend=y

您发布的代码可能还有另一个问题。 RhpPluginInit() 的实现使用 RhapsodyAppServer 来获取对 Rhapsody 的引用。如果你有多个 Rhapsody 运行ning 实例,这将 return 你引用第一个启动的实例 - 不一定是你 运行 插件的实例。因此,您的日志消息可能会出现在错误的 Rhapsody 实例中!

解决方案很简单 - 将您的代码更改为:

@Override
public void RhpPluginInit(IRPApplication rpy) {
    rpy.writeToOutputWindow("Log", "test\n");
}

(插件代码中通常不需要 RhapsodyAppServer - 通常只需要 运行 Rhapsody 外部的加载项或脚本。)

此致, 西蒙