我在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>
中设置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(...)
加载库,但我也尝试在LD_LIBRARY_PATH
下Environment variables
设置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的这个提示!
提前感谢您对此事的任何帮助!
-Martin