我在 linux 上遇到了 java.library.path 的一个奇怪问题,我不确定问题是 IntelliJ 的想法还是 java.library.path 在 windows 和 linux 上的使用方式不同。
设置是在 Intellij 中创建一个简单的 JUnit4 测试用例,如下所示:
System.out.println("java.library.path = " + System.getProperty("java.library.path"));
System.out.println("LD_LIBRARY_PATH = " + System.getenv("LD_LIBRARY_PATH"));
String directory = Paths.get("../../../../test-project/linux32").toAbsolutePath().toRealPath().toString();
System.out.println("Loading: " + directory + "/dummy.so" + " with System.load(..)");
System.load(directory + "/dummy.so");
System.out.println("SUCCESS!");
System.out.println("Loading: " + "dummy" + " with System.loadLibrary(..)");
System.loadLibrary("dummy");
System.out.println("SUCCESS!");
为了为给定的测试用例设置 java.library.path 我去Edit Configurations...
设置-ea -Djava.library.path=</path/to/directory/containing/dummy.so>
in VM options
,但是在运行测试用例之后,这是输出:
java.library.path = </path/to/directory/containing/dummy.so>
LD_LIBRARY_PATH = </path/to/directory/containing/dummy.so>
Loading: </path/to/directory/containing/dummy.so>/dummy.so with System.load(..)
SUCCESS!
Loading: dummy with System.loadLibrary(..)
java.lang.UnsatisfiedLinkError: no dummy in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1867)
at java.lang.Runtime.loadLibrary0(Runtime.java:870)
at java.lang.System.loadLibrary(System.java:1122)
at LoadLibraryTest.loadLibraryTest(LoadLibraryTest.java:21)
如您所见,我尝试使用System.load(...)
first 加载该库,并且我还尝试将LD_LIBRARY_PATH
under Environment variables
in设置为与没有任何成功Edit Configurations...
的目录相同的目录。java.library.path
由于给定的java.lang.UnsatisfiedLinkError: no dummy in java.library.path
错误,该问题与未找到依赖库无关。
当我在 Windows 中尝试相同的设置时,一切正常,只要我设置java.library.path
正确,库就会成功加载。如果java.library.path
不正确,则测试显然也会在 Windows 上失败。我已经尝试过设置和不设置LD_LIBRARY_PATH
,java.library.path
以及两者的每一种组合,在 Linux 上的结果没有变化。似乎设置java.library.path
对linux没有影响,但我不知道这是IntelliJ中的错误还是与linux相关的东西。
编辑:
在此处显示的原始测试用例中,调用了库libdummy.so
,在这种情况下,只需删除lib
调用中的前缀即可System.loadLibrary
工作,但在我的真实情况下,库没有lib
前缀,因此我现在相应地更新了测试用例并重新编译具有名称的测试库,dummy.so
现在测试用例再次失败并出现相同的错误,如上所述。感谢 KC Wong 的提示!
在此先感谢您对此事的任何帮助!
-马丁