【问题标题】:eclipse plugin not loading dll due to long path由于路径长,eclipse插件不加载dll
【发布时间】:2009-06-02 16:50:19
【问题描述】:

我正在构建一个 Eclipse 插件(一个注释插件,但它最终是一个 Eclipse 插件)。我的插件依赖的插件之一需要加载本机 dll。

问题是,取决于此类 dll 在磁盘中的位置而失败。如果它长于某个阈值,我会收到以下错误

java.lang.UnsatisfiedLinkError: nlsxbe(文件名或扩展名太长。) 在 java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:952) 在 java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:921) 在 java.lang.System.loadLibrary(System.java:452) 在 lotus.domino.NotesThread.load(未知来源) 在 lotus.domino.NotesThread.checkLoaded(未知来源) 在 lotus.domino.NotesThread.sinitThread(未知来源) 在 com.atempo.adam.lotus.plugin.views.TopicView.createPartControl(TopicView.java:609)

我已经添加了 Path env var 的路径,并且还注册了 dll 无济于事。我的环境是 Ms vista profesional,java1.5,eclipse3.4(和 lotus 8)

有人知道吗?

非常感谢。

【问题讨论】:

    标签: eclipse dll eclipse-plugin java-native-interface osgi


    【解决方案1】:

    我也遇到过类似的问题,只需要确保文件不在长路径中。

    有很多程序似乎存在路径长问题,包括一些内置的 Windows 程序。

    您是否可以控制此 DLL 所在的位置?

    【讨论】:

      【解决方案2】:

      我已尝试注册 dll 并将其移至 c:\windows\system32(较短的路径),但我的 Lotus Notes 插件无法加载所需的库 (Notes.jar)。

      只有在我将 Lotus Notes 安装在比“c:\program files\IBM\lotus\Notes”更短的路径中才能正常工作。例如,如果我将它安装在“c:\Archivos de programa\IBM\lotus\Notes”中,它可以找到我的 dll,但无法加载库。

      错误是:

      GRAVE 无法创建视图 ID com.atempo.adam.lotus.plugin.views.TopicView: nlsxbe (文件名或扩展名太长。) ::class.method=unknown ::thread=main ::loggername= org.eclipse.ui.workbench

      java.lang.UnsatisfiedLinkError: nlsxbe (The filename or extension is too long. )
      at java.lang.ClassLoader.loadLibraryWithPath(ClassLoader.java:952)
      at java.lang.ClassLoader.loadLibraryWithClassLoader(ClassLoader.java:921)
      at java.lang.System.loadLibrary(System.java:452)
      at lotus.domino.NotesThread.load(Unknown Source)
      at lotus.domino.NotesThread.checkLoaded(Unknown Source)
      at lotus.domino.NotesThread.sinitThread(Unknown Source)
      at com.atempo.adam.lotus.plugin.views.TopicView.createPartControl(TopicView.java:639)
      at org.eclipse.ui.internal.ViewReference.createPartHelper(ViewReference.java:332)
      at org.eclipse.ui.internal.ViewReference.createPart(ViewReference.java:197)
      at org.eclipse.ui.internal.WorkbenchPartReference.getPart(WorkbenchPartReference.java:566)
      at org.eclipse.ui.internal.PartPane.setVisible(PartPane.java:290)
      at org.eclipse.ui.internal.ViewPane.setVisible(ViewPane.java:525)
      at org.eclipse.ui.internal.presentations.PresentablePart.setVisible(PresentablePart.java:140)
      at com.ibm.rcp.ui.internal.presentations.FolderStackPresentation.selectPart(FolderStackPresentation.java:692)
      at org.eclipse.ui.internal.PartStack.refreshPresentationSelection(PartStack.java:1144)
      at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:620)
      at org.eclipse.ui.internal.PartStack.createControl(PartStack.java:532)
      at org.eclipse.ui.internal.PartSashContainer.createControl(PartSashContainer.java:562)
      at org.eclipse.ui.internal.PerspectiveHelper.activate(PerspectiveHelper.java:244)
      at org.eclipse.ui.internal.Perspective.onActivate(Perspective.java:815)
      at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3269)
      at org.eclipse.ui.internal.WorkbenchPage.busySetPerspective(WorkbenchPage.java:956)
      at org.eclipse.ui.internal.WorkbenchPage.access$12(WorkbenchPage.java:940)
      at org.eclipse.ui.internal.WorkbenchPage$12.run(WorkbenchPage.java:3368)
      at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:67)
      at org.eclipse.ui.internal.WorkbenchPage.setPerspective(WorkbenchPage.java:3366)
      at org.eclipse.ui.internal.Workbench.showPerspective(Workbench.java:2102)
      at com.ibm.rcp.portal.app.ui.internal.serviceImpl.DoInternalUIService.openApplicationPerspective(DoInternalUIService.java:981)
      at com.ibm.rcp.portal.app.ui.internal.serviceImpl.DoInternalUIService.openApplicationPerspective(DoInternalUIService.java:886)
      at com.ibm.rcp.portal.app.ui.internal.serviceImpl.DoInternalUIService.openApplicationPerspectiveWithNavigator(DoInternalUIService.java:863)
      at com.ibm.rcp.portal.app.ui.internal.serviceImpl.DoInternalUIService.access$12(DoInternalUIService.java:857)
      at com.ibm.rcp.portal.app.ui.internal.serviceImpl.DoInternalUIService$8.run(DoInternalUIService.java:1197)
      at org.eclipse.ui.internal.UILockListener.doPendingWork(UILockListener.java:155)
      at org.eclipse.ui.internal.UISynchronizer$1.run(UISynchronizer.java:36)
      at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
      at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
      at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3659)
      at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3296)
      at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:1931)
      at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:1895)
      at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:423)
      at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
      at com.ibm.rcp.personality.framework.internal.RCPApplication.run(RCPApplication.java:72)
      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 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:64)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:615)
      at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:549)
      at org.eclipse.equinox.launcher.Main.basicRun(Main.java:504)
      at org.eclipse.equinox.launcher.Main.run(Main.java:1236)
      at org.eclipse.equinox.launcher.Main.main(Main.java:1212)
      at org.eclipse.core.launcher.Main.main(Main.java:30)
      

      谢谢。

      【讨论】:

        【解决方案3】:

        这是 Windows MAX_PATH 限制的症状之一。有关于它的知识库注释(例如320081)和一些关于处理这些文件的手动方法的讨论,您可以使用 Google 轻松找到。

        问题在于 Windows 对用于各种系统和命令级调用的完整文件路径的长度有限制。尽管用户社区已经进行了很多讨论(甚至在 Microsoft KB 中尝试了一些新颖的东西),但它们都归结为您通过公平或错误的方式缩短了相关文件的文件路径。

        以太坊中有一些迹象表明,Microsoft 的 Unicode API 允许(最多)32k 字节的文件路径,但我不知道这是否属实。但是,仍然存在许多现有程序不使用这些 API 并因此超出此限制的情况。 (Windows API 甚至有可能使用 UTF16(或 UCS2),在这种情况下这仅意味着 16k 个字符——有人知道吗?)

        系统允许您通过多种方法创建“无法访问”的文件路径——一种是通过导航逐步创建路径中的步骤;另一种是挂载共享——有时系统功能和实用程序在内部依赖完整的文件路径进行操作,这超出了这个限制。

        除非从 Windows 系统代码中删除这个基本的愚蠢限制,否则唯一的办法就是移动和/或重命名文件……

        …或运行 Unix。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-12-20
          • 2016-07-10
          • 1970-01-01
          • 1970-01-01
          • 2014-09-08
          • 2012-08-23
          • 2017-09-11
          • 1970-01-01
          相关资源
          最近更新 更多