代码之家  ›  专栏  ›  技术社区  ›  vikramjb

在Sametime中插入Lotus Notes Classess插件-整个故事

  •  1
  • vikramjb  · 技术社区  · 16 年前

    这将是一个很长的阅读,所以感谢你的耐心:)。

    我一直在尝试开发一个在LotusSametime中执行的插件。这个插件的想法是提取给定日期的日历条目,然后用Sametime显示。很简单,不是吗,我也这么认为。显然,我错了,并且严重误解了JVM版本兼容性问题。我首先在默认的Java 1.6中做了一个独立的测试,它工作得很好,我得到了条目,并准备好了代码,可以移动到SAMETIME开发环境。

    我移动到插件开发环境来插入代码,我的第一个问题是将notes.jar添加到外部jar列表和导入lotus.domino行。情报局告诉我的

    The type org.omg.CORBA.UserException cannot be resolved. It is indirectly referenced from required .class files
    

    在谷歌搜索之后,我在项目中引用了ibmorbapi.jar并运行它。不幸的是,对我来说,即使这样也不行。插件本身加载失败,这就是我得到的

        java.lang.NoClassDefFoundError: lotus.notes.Session
     at java.lang.J9VMInternals.verifyImpl(Native Method)
     at java.lang.J9VMInternals.verify(J9VMInternals.java:59)
     at java.lang.J9VMInternals.initialize(J9VMInternals.java:120)
     at java.lang.Class.newInstanceImpl(Native Method)
     at java.lang.Class.newInstance(Class.java:1244)
     at org.eclipse.core.internal.registry.osgi.RegistryStrategyOSGI.createExecutableExtension(RegistryStrategyOSGI.java:157)
     at org.eclipse.core.internal.registry.ExtensionRegistry.createExecutableExtension(ExtensionRegistry.java:759)
     at org.eclipse.core.internal.registry.ConfigurationElement.createExecutableExtension(ConfigurationElement.java:243)
     at org.eclipse.core.internal.registry.ConfigurationElementHandle.createExecutableExtension(ConfigurationElementHandle.java:51)
     at com.ibm.collaboration.realtime.imhub.ImHub.loadMiniAppExtensions(ImHub.java:416)
     at com.ibm.collaboration.realtime.imhub.ImHub.getMiniApps(ImHub.java:356)
     at com.ibm.collaboration.realtime.imhub.workbench.ImHubWorkbenchWindowAdvisorShelf.transformMiniApps(ImHubWorkbenchWindowAdvisorShelf.java:354)
     at com.ibm.collaboration.realtime.imhub.workbench.ImHubWorkbenchWindowAdvisorShelf.createWindowContents(ImHubWorkbenchWindowAdvisorShelf.java:179)
     at org.eclipse.ui.internal.WorkbenchWindow.createContents(WorkbenchWindow.java:938)
     at org.eclipse.jface.window.Window.create(Window.java:426)
     at org.eclipse.ui.internal.Workbench.busyOpenWorkbenchWindow(Workbench.java:805)
     at org.eclipse.ui.internal.Workbench.doOpenFirstTimeWindow(Workbench.java:1453)
     at org.eclipse.ui.internal.Workbench.openFirstTimeWindow(Workbench.java:1404)
     at org.eclipse.ui.internal.WorkbenchConfigurer.openFirstTimeWindow(WorkbenchConfigurer.java:190)
     at org.eclipse.ui.application.WorkbenchAdvisor.openWindows(WorkbenchAdvisor.java:708)
     at org.eclipse.ui.internal.Workbench.init(Workbench.java:1101)
     at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1863)
     at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)
     at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
     at com.ibm.collaboration.realtime.ui.WorkbenchAdapter.createAndRunWorkbench(WorkbenchAdapter.java:103)
     at com.ibm.collaboration.realtime.ui.WorkbenchAdapter.run(WorkbenchAdapter.java:85)
     at com.ibm.collaboration.realtime.application.RTCApplication.run(RTCApplication.java:765)
     at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
     at java.lang.reflect.AccessibleObject.invokeL(AccessibleObject.java:211)
     at java.lang.reflect.Method.invoke(Method.java:272)
     at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
     at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
     at org.eclipse.core.launcher.Main.run(Main.java:977)
     at org.eclipse.core.launcher.Main.main(Main.java:952)
    

    因为那不起作用。我想,为什么不将noteScalendarExtraction部分创建到一个单独的JAR执行文件中,并获取一个包含日历条目的XML文件,然后将其交给插件来显示这些条目呢?我知道这不是最好的解决办法,但我绝望了,我想让这个办法奏效。在任何情况下,当我对JAR文件和生成的XML文件的路径进行了硬编码时,这个想法有点奏效。顺便说一下,我使用Java中的GeRunTun.Exc模块来执行JAR文件。时间到了,它一般地运行,不幸的是,对我来说,exec模块不接受其路径中的空格,所以程序文件是没有问题的。我不确定这是否是正确的方法,但是这样的jar出于某种原因也没有执行。我尝试使用适当的命令行参数放入BAT文件,它在命令行中执行时生成XML,但在从Eclipse IDE运行时不生成XML,原因仅限于IDE。我现在没有选择了,我得到了另一个插件,它在获取日历条目方面做了完全相同的事情。我对插件进行了反编译,并检查了源代码,发现代码使用了类加载器来完成这项工作。当我看到这段代码时,我有了新的希望。在谷歌搜索之后,我整理了一些代码,为我完成了这项工作。酸测试的时候到了,我把代码放到插件env中,这就是我得到的。

        !ENTRY org.eclipse.ui 4 0 2009-09-27 22:05:55.996
    !MESSAGE (org/omg/CORBA/UserException) bad major version at offset=6
    !STACK 0
    java.lang.UnsupportedClassVersionError: (org/omg/CORBA/UserException) bad major version at offset=6
     at java.lang.ClassLoader.defineClassImpl(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:246)
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:109)
     at java.net.URLClassLoader.findClassImpl(URLClassLoader.java:1028)
     at java.net.URLClassLoader$4.run(URLClassLoader.java:549)
     at java.security.AccessController.doPrivileged(AccessController.java:213)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:547)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:625)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:582)
     at java.lang.ClassLoader.defineClassImpl(Native Method)
     at java.lang.ClassLoader.defineClass(ClassLoader.java:246)
     at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:109)
     at java.net.URLClassLoader.findClassImpl(URLClassLoader.java:1028)
     at java.net.URLClassLoader$4.run(URLClassLoader.java:549)
     at java.security.AccessController.doPrivileged(AccessController.java:213)
     at java.net.URLClassLoader.findClass(URLClassLoader.java:547)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:625)
     at java.lang.ClassLoader.loadClass(ClassLoader.java:582)
     at java.lang.J9VMInternals.verifyImpl(Native Method)
     at java.lang.J9VMInternals.verify(J9VMInternals.java:59)
     at java.lang.J9VMInternals.initialize(J9VMInternals.java:120)
     at java.lang.reflect.AccessibleObject.initializeClass(Native Method)
     at java.lang.reflect.Method.invoke(Method.java:248)
     at com.ibm.collaboration.realtime.lotusnotes.LotusNotes.getNotesSession(LotusNotes.java:179)
     at com.ibm.notes.sametime.calendar.hack.SpeakUpMiniApp.createControl(SpeakUpMiniApp.java:58)
     at com.ibm.collaboration.realtime.miniapp.MiniAppViewPart.createPartControl(MiniAppViewPart.java:41)
     at com.ibm.rcp.ui.internal.shelf.ShelfViewReference.createPartHelper(ShelfViewReference.java:330)
     at com.ibm.rcp.ui.internal.shelf.ShelfViewReference.createPart(ShelfViewReference.java:201)
     at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:566)
     at com.ibm.rcp.ui.shelf.ShelfPage.activatePart(ShelfPage.java:1168)
     at com.ibm.rcp.ui.shelf.ShelfPage.access$10(ShelfPage.java:1159)
     at com.ibm.rcp.ui.shelf.ShelfPage$7.handleEvent(ShelfPage.java:1312)
     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:962)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:947)
     at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:706)
     at com.ibm.rcp.swt.swidgets.SViewForm.toggleMaximize(SViewForm.java:1501)
     at com.ibm.rcp.swt.swidgets.SViewStack.expand(SViewStack.java:596)
     at com.ibm.rcp.swt.swidgets.SViewStack.toggleMaximize(SViewStack.java:526)
     at com.ibm.rcp.swt.swidgets.SViewStack$5.handleEvent(SViewStack.java:312)
     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:962)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:947)
     at org.eclipse.swt.widgets.Widget.notifyListeners(Widget.java:706)
     at com.ibm.rcp.swt.swidgets.SViewForm.onMouseUpMaximize(SViewForm.java:1437)
     at com.ibm.rcp.swt.swidgets.SViewForm.onMouseUp(SViewForm.java:1127)
     at com.ibm.rcp.swt.swidgets.SViewForm$4.handleEvent(SViewForm.java:421)
     at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:66)
     at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:938)
     at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3673)
     at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3284)
     at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1930)
     at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1894)
     at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:422)
     at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
     at com.ibm.collaboration.realtime.ui.WorkbenchAdapter.createAndRunWorkbench(WorkbenchAdapter.java:103)
     at com.ibm.collaboration.realtime.ui.WorkbenchAdapter.run(WorkbenchAdapter.java:85)
     at com.ibm.collaboration.realtime.application.RTCApplication.run(RTCApplication.java:765)
     at org.eclipse.core.internal.runtime.PlatformActivator$1.run(PlatformActivator.java:78)
     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:92)
     at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:68)
     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:400)
     at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:177)
     at java.lang.reflect.AccessibleObject.invokeL(AccessibleObject.java:211)
     at java.lang.reflect.Method.invoke(Method.java:272)
     at org.eclipse.core.launcher.Main.invokeFramework(Main.java:336)
     at org.eclipse.core.launcher.Main.basicRun(Main.java:280)
     at org.eclipse.core.launcher.Main.run(Main.java:977)
     at org.eclipse.core.launcher.Main.main(Main.java:952)
    

    版本错误又让人沮丧了。Sametime插件开发环境运行在J9JVM上,出于某种原因,我想这对于notes.jar ibmorbapi.jar来说是不够的。至少这是我对错误的假设。

    我很感谢你们的帮助。”org/omg/corba/userexception“似乎是问题的症结所在,我无法克服它。我可以让外部JAR执行以某种复杂的方式工作,但我不想这样做,因为我觉得这是从注释中获取日历条目的最佳方式。我相信这必须是相当简单的,任何帮助这将是感激。

    2 回复  |  直到 16 年前
        1
  •  1
  •   Vladimir Dyuzhev    16 年前

    看起来CORBA类是为更新的JDK编译的。您需要找到JAR的旧版本,或者,也可以获取源代码并在JDK(J9?)下编译它们。从一个简短的谷歌搜索中我看到,J9要么是1.4,要么甚至是1.3兼容。

    另外,确保你编译的所有代码都具有相同的目标Java版本,即1.4(1.3?)。在这种情况下。

        2
  •  2
  •   Sio    16 年前

    有两个JAR与与与Notes应用程序对话相关。

    罐子 -这是lsxbe类的JNI包装。为了使其正常工作,您需要在计算机上安装LotusNotes,并在系统路径上安装主目录。

    NCSO.JAR -这是为了建立到Domino服务器的DIIOP连接。这不需要安装Lotus Notes。它确实需要一个Domino服务器,您可以连接到该服务器上启用了DIIOP。

    不清楚您是否安装了Notes?

    JAR也特定于某些JVM版本。

    • Java 6 -注释8.5.1
    • Java 5 -注释8 x
    • Java1.4.2-Notes 7 x
    • Java 1.3 -注释6 x

    “错误的主要版本在偏移位置”意味着您为JVM运行了错误的JAR(例如1.4.2上的851 JAR)。

    为了排除任何配置问题,首先建议创建一个简单的Java应用程序,该应用程序连接到Notes/Domino。一旦成功,您就知道路径/jar都设置正确。