1

这将是一个漫长的阅读所以感谢您的耐心:)。

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

我转移到插件开发环境来插入我的代码。我的第一个问题来了,当我将 Notes.jar 添加到外部 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 模块不接受其路径中的空格,因此程序文件是没有问题的。我不确定这是否是正确的方法,但是由于某种原因,jar 本身也没有执行。我尝试使用适当的命令行参数放入一个bat文件,它在命令行中执行时生成了xml,但在从eclipse ide运行时却没有,原因只有IDE知道。在这一点上我没有选择,我得到了另一个插件,它在获取日历条目方面做了完全相同的事情。我反编译了插件并检查了源代码,发现代码正在使用类加载器来完成这项工作。当我看到这段代码时,我有了新的希望。经过一番谷歌搜索后,我整理了一些代码,这些代码为我完成了这项工作。是时候进行酸性测试了,我将代码放入插件环境中,这就是我得到的。在这一点上我没有选择,我得到了另一个插件,它在获取日历条目方面做了完全相同的事情。我反编译了插件并检查了源代码,发现代码正在使用类加载器来完成这项工作。当我看到这段代码时,我有了新的希望。经过一番谷歌搜索后,我整理了一些代码,这些代码为我完成了这项工作。是时候进行酸性测试了,我将代码放入插件环境中,这就是我得到的。在这一点上我没有选择,我得到了另一个插件,它在获取日历条目方面做了完全相同的事情。我反编译了插件并检查了源代码,发现代码正在使用类加载器来完成这项工作。当我看到这段代码时,我有了新的希望。经过一番谷歌搜索后,我整理了一些代码,这些代码为我完成了这项工作。是时候进行酸性测试了,我将代码放入插件环境中,这就是我得到的。

    !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 插件开发环境在 J9 JVM 上运行,出于某种原因,我猜对于 notes.jar ibmorbapi.jar 来说还不够。至少这就是我对错误的假设。

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

4

2 回答 2

2

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

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

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

不清楚您是否安装了 Notes?

jars 也特定于某些 JVM 版本。

  • Java 6 - 注释 8.5.1
  • Java 5 - 注释 8.x
  • Java 1.4.2 - 注释 7.x
  • Java 1.3 - 笔记 6.x

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

为了首先排除任何配置问题,我建议只创建一个简单的 java 应用程序,它可以连接到 Notes/Domino。一旦成功,您就知道您的路径/罐子都已正确设置。

于 2010-02-26T16:32:32.163 回答
1

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

此外,请确保您自己编译的所有代码都具有相同的目标 Java 版本,即在本例中为 1.4(1.3?)。

于 2009-09-27T17:10:49.023 回答