与Lotus Notes类同时插入 - 整个故事

时间:2009-09-27 16:44:56

标签: java plugins lotus-notes lotus-domino sametime

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

我一直在尝试开发一个在Lotus Sametime中执行的插件。这个插件的想法是提取给定日期的日历条目,然后在同一时间显示它。简单不是这样,我也这么认为。显然我错了,并且严重误解了JVM版本的兼容性问题。我首先在默认的Java 1.6中进行了一次独立测试,它运行良好,我得到了条目并准备好了代码,以便转移到Sametime Development环境。

我移动到插件开发环境来插入我的代码。我第一个问题来了,当我将Notes.jar添加到External jar列表和import lotus.domino行时。 IDE告诉我这个

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中的getRuntime.exec模块执行jar文件。时间来让它一直运行,不幸的是,对于我来说,exec模块不接受其路径中的空格,因此程序文件是不可能的。我不确定这是否是正确的方法但是由于某种原因,罐子本身也没有执行。我尝试使用适当的命令行参数放入一个bat文件,并在命令行中执行时生成xml,但是当从Eclipse中运行时,由于只有IDE知道的原因才生成xml。在这一点上我没有选择,我得到了另一个插件,它在获取日历条目方面做了完全相同的事情。我反编译了插件并检查了源代码并看到代码使用类加载器来完成这项工作。当我看到这段代码时,一个新的希望进入了我。经过一些谷歌搜索后,我整理了一些代码,为我完成了这项工作。时间来了酸测试,我把代码放入插件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)

版本错误再次令人沮丧。同时插件开发环境在J9 JVM上运行,由于某些原因,我认为这对于notes.jar ibmorbapi.jar是不够的。至少这是我对错误的假设。

我很感激你们的任何帮助。 “org / omg / CORBA / UserException”似乎是问题的症结所在,我根本无法克服它。我可以以一些复杂的方式执行外部jar执行,但我不想这样做,因为我觉得它是从笔记中获取日历条目的最佳方式。我相信它必须相当简单,对此的任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:2)

有两个与Notes应用程序通信相关的jar。

Notes.jar - 这是LSXBE类的JNI包装器。为了使其正常工作,您需要在机器上安装Lotus Notes和系统PATH上的主目录。

NCSO.jar - 这是用于与Domino服务器建立DIIOP连接。这不需要安装Lotus Notes。它确实需要一个可以连接到其上的DIIOP的Domino服务器。

目前还不清楚你是否安装了Notes?

这些jar也特定于某些JVM版本。

  • Java 6 - Notes 8.5.1
  • Java 5 - Notes 8.x
  • Java 1.4.2 - Notes 7.x
  • Java 1.3 - Notes 6.x

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

首先要排除任何配置问题,我建议只创建一个简单的Java应用程序,它连接到Notes / Domino。一旦有效,那么您就知道您的路径/罐子都已正确设置。

答案 1 :(得分:1)

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

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