【问题标题】:Running an IBM Notes Java Application on OS X El Capitan throws UnsatisfiedLinkError在 OS X El Capitan 上运行 IBM Notes Java 应用程序会引发 UnsatisfiedLinkError
【发布时间】:2017-01-21 01:19:06
【问题描述】:

我正在尝试在 Mac 上运行一个访问 Notes 客户端的 HelloWord Java 应用程序。我在旧版本上工作过。目前我有 Java 1.8.0_101-b13 和 OS/X 10.11.6。我尝试运行这段代码:

import lotus.domino.NotesException;
import lotus.domino.NotesFactory;
import lotus.domino.NotesThread;
import lotus.domino.Session;

public class HelloWorld {

  public static void main(String[] args) throws NotesException {
    HelloWorld hw = new HelloWorld();
    hw.sayHello();
  }

  private void sayHello() throws NotesException {
    System.out.println("java.library.path: "+ System.getProperty("java.library.path"));
    System.out.println("PATH: "+ System.getenv("PATH"));
    NotesThread.sinitThread();
    Session s = NotesFactory.createSession();
    System.out.println(s.getEffectiveUserName());
    NotesThread.stermThread();
  }
} 

我在 Eclipse 运行配置中设置了 LD_LIBRARY_PATH=/Applications/IBM Notes.app。当我运行应用程序时,我得到:

java.library.path:/Applications/IBM Notes.app:/Users/joe/Library/Java/Extensions:/Library/Java/Extensions:/Network/Library/Java/Extensions:/System/Library/Java /扩展:/usr/lib/java:。 路径:/Applications/IBM Notes.app:/usr/bin:/bin:/usr/sbin:/sbin 线程“主”java.lang.UnsatisfiedLinkError 中的异常:java.library.path 中没有 lsxbe 在 java.lang.ClassLoader.loadLibrary(ClassLoader.java:1864) 在 java.lang.Runtime.loadLibrary0(Runtime.java:870) 在 java.lang.System.loadLibrary(System.java:1122) 在 lotus.domino.NotesThread.load(未知来源) 在 lotus.domino.NotesThread.checkLoaded(未知来源) 在 lotus.domino.NotesThread.sinitThread(未知来源) 在 com.notessensei.HelloWorld.sayHello(HelloWorld.java:31) 在 com.notessensei.HelloWorld.main(HelloWorld.java:20)

库路径看起来不错。我一定遗漏了一些明显的东西?

更新:当您查看输出时,Java 选择了 LD_LIBRARY_PATH 变量,因此似乎不需要 DYLD_LIBRARY_PATH(我添加它以进行测试,但无济于事)。 DYLD... 在 OS/X 上似乎是 be problematic

一个不清楚的想法:在 OS/X 世界中,您通常指向应用程序 (IBM Notes.app),但内容实际上在 appname.app/Contents/MacOS 中。我想我都尝试了相同的结果。路径中的空间是否会抛出?

更新2:根据otool -L liblsxbe.dylib的要求输出

liblsxbe.dylib: @executable_path/liblsxbe.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libxmlproc.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libnotes.dylib(兼容版本 0.0.0,当前版本 0.0.0) /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon(兼容版本 2.0.0,当前版本 157.0.0) /usr/lib/libstdc++.6.dylib(兼容版本 7.0.0,当前版本 60.0.0) /usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本1197.1.1)

otool -L libxmlproc.dylib

libxmlproc.dylib: @executable_path/libxmlproc.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libnotes.dylib(兼容版本 0.0.0,当前版本 0.0.0) /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon(兼容版本 2.0.0,当前版本 157.0.0) /usr/lib/libstdc++.6.dylib(兼容版本 7.0.0,当前版本 60.0.0) /usr/lib/libSystem.B.dylib(兼容版本1.0.0,当前版本1197.1.1)

`otool -L libnotes.dylib'

libnotes.dylib: @executable_path/libnotes.dylib(兼容版本 0.0.0,当前版本 0.0.0) /usr/lib/libresolv.9.dylib(兼容版本 1.0.0,当前版本 1.0.0) @executable_path/libjsmac.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libndgts.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libxmlproc.dylib(兼容版本 0.0.0,当前版本 0.0.0) @executable_path/libgsk8iccs.dylib(兼容版本 0.0.0,当前版本 0.0.0) /System/Library/Frameworks/Security.framework/Versions/A/Security(兼容版本1.0.0,当前版本55471.14.0) /System/Library/Frameworks/IOKit.framework/Versions/A/IOKit(兼容版本1.0.0,当前版本275.0.0) /System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa(兼容版本1.0.0,当前版本20.0.0) /System/Library/Frameworks/Carbon.framework/Versions/A/Carbon(兼容版本 2.0.0,当前版本 157.0.0) /usr/lib/libstdc++.6.dylib(兼容版本 7.0.0,当前版本 60.0.0) /usr/lib/libSystem.B.dylib(兼容版本 1.0.0,当前版本 1197.1.1) /System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation(兼容版本150.0.0,当前版本855.14.0) /usr/lib/libobjc.A.dylib(兼容版本 1.0.0,当前版本 228.0.0) /System/Library/Frameworks/AppKit.framework/Versions/C/AppKit(兼容版本45.0.0,当前版本1265.19.0) /System/Library/Frameworks/CFNetwork.framework/Versions/A/CFNetwork(兼容版本1.0.0,当前版本673.2.1) /System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices(兼容版本1.0.0,当前版本48.0.0) /System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices(兼容版本1.0.0,当前版本59.0.0)

还有什么?

【问题讨论】:

  • 在 Mac OS X 上是 DYLD_LIBRARY_PATH
  • @user2543253 不再:github.com/soumith/cudnn.torch/issues/111 被 El Captain 屏蔽。我也确实设置了 - 修改问题
  • 啊,很高兴知道,谢谢。但是这个库实际上是在/Applications/IBM Notes.app 中吗?我宁愿期待/Applications/IBM Notes.app/Contents/MacOSX
  • 阅读您的更新。您说 Java 选择了“LD_LIBRARY_PATH”,但 Mac OS X 动态加载器也这样做吗?该库有自己的依赖项。你能检查一下otool -L 的输出是否好看吗?
  • 已经有一段时间了,但“@executable_path”没有指定应用程序所在的位置吗?在您的情况下,哪个是java?您是否也尝试过 DYLD_FALLBACK_LIBRARY_PATH?

标签: java eclipse java-native-interface lotus-notes osx-elcapitan


【解决方案1】:

经过多次探索,结果发现有 2 个问题需要解决。第一个,在post by Mikkel Flint Heisterberg 中描述。除了DYLD_LIBRARY_PATH,还需要设置另一个环境变量:NOTESBIN。两者都指向同一个位置:

DYLD_LIBRARY_PATH=/Applications/IBM Notes.app/Contents/MacOS
NOTESBIN=/Applications/IBM Notes.app/Contents/MacOS

Eclipse 运行配置中不需要引号或反斜杠。

第二个比较棘手。为方便起见,因为它之前工作,我创建了一个名为“Notes9”的新条目“已安装的 JVM”。在那里,我指出了 Oracle JVM8(是的,在 Mac Notes 上运行 Java8) Notes 程序目录 jvm/lib/ext 中的 Notes.jar(和其他)。

Mac(不再)不喜欢那样了。一旦我指向一个“裸”的 JVM8 并添加 Notes.jar 作为外部 Jar 依赖项,一切都开始按预期工作。

【讨论】:

    【解决方案2】:

    我一直在努力解决几乎相同的问题。我按照您在答案的第一部分中所做的那样,将 Eclipse 中的环境变量设置为以下内容

    DYLD_LIBRARY_PATH=/Applications/IBM Notes.app/Contents/MacOS
    NOTESBIN=/Applications/IBM Notes.app/Contents/MacOS
    

    我也在我的.bashrc文件中写道:

    PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/myuser/bin:/Applications/IBM\ Notes.app/Contents/MacOS
    

    在我的.profile:

    export DYLD_LIBRARY_PATH=/Applications/IBM\ Notes.app/Contents/MacOS
    export PATH=$PATH
    
    # Update bashrc 
    if [ -f ~/.bashrc ]; then
       source ~/.bashrc
    fi
    

    我在尝试解决这个问题时一直在使用 Eclipse Mars,但似乎 PATH 和 java.library.path 都不正确。我受够了火星,决定下载氧气。我不知道为什么,但是在我安装了 Oxygen,将环境变量添加到 Eclipse 并使用 Java 1.8 之后,我能够通过您的示例获得有效的用户名,并且相同的解决方案适用于我们正在开发的更大的应用程序。

    我只是将此答案添加为您答案的补充。我很高兴我在 SO 上找到了这个问题。谢谢。

    【讨论】:

      猜你喜欢
      • 2015-12-11
      • 2016-11-02
      • 2016-06-29
      • 1970-01-01
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-02-27
      • 2016-12-30
      相关资源
      最近更新 更多