为什么java.library.path不能在ubuntu上运行?

问题描述 投票:2回答:3

我正在研究一个需要一些库的java组件,即用于Windows系统的.dll和用于Linux系统的.so文件。所以我在netbeans中准备了一个java应用程序,并添加了一些依赖jar并构建项目。

在Windows上执行:

当我尝试使用命令java -jar appName.jar在Windows系统上运行jar文件时,我得到了java.lang.UnsatisfiedLinkError所以我在执行时指定了java.library.path,就像java -Djava.library.path=full\\path\\to\\libs -jar appName.jar一样,它在Windows上运行成功。

在Linux上执行(ubuntu):

当我尝试使用相同的命令java -Djava.library.path=/path/to/libs -jar appName.jar在ubuntu上执行相同的jar文件时,我收到错误,说在指定位置找不到某些.so文件(我检查了文件位置和权限,一切正常)

更新(添加错误):

ubuntu @ ubuntu-HP-dx2480-MT-KL969AV:〜/ Desktop $ java -Djava.library.path = / home / ubuntu / Desktop / bin -jar JavaApplication4.jar

初始化Thread [AWT-EventQueue-0,6,main]与库路径bin bin / jcef_helper:加载共享库时出错:libcef.so:无法打开共享对象文件:没有这样的文件或目录

包含bin文件夹

-rwxr-xr-x 1 ubuntu ubuntu   1483321 Jun 18  2014 cef.pak
-rwxr-xr-x 1 ubuntu ubuntu   3258231 Jun 18  2014 devtools_resources.pak
-rwxr-xr-x 1 ubuntu ubuntu    971264 Jun 11  2014 ffmpegsumo.dll
-rwxr-xr-x 1 ubuntu ubuntu   9994752 Jun 11  2014 icudt.dll
-rwxr-xr-x 1 ubuntu ubuntu    429568 Jun 18  2014 jcef.dll
-rwxr-xr-x 1 ubuntu ubuntu    481488 Jun 18  2014 jcef_helper
-rwxr-xr-x 1 ubuntu ubuntu    233984 Jun 18  2014 jcef_helper.exe
-rwxr-xr-x 1 ubuntu ubuntu  53280768 Jun 11  2014 libcef.dll
-rwxr-xr-x 1 ubuntu ubuntu 105317136 Jun 18  2014 libcef.so
-rwxr-xr-x 1 ubuntu ubuntu   1309288 Jun 18  2014 libffmpegsumo.so
-rwxr-xr-x 1 ubuntu ubuntu   1047296 Jun 18  2014 libjcef.so drwxrwxrwx 2 ubuntu ubuntu      4096 Dec 23 11:29 locales

通过一些搜索,我知道我已经尝试使用LD_LIBRARY_PATH环境变量,所以我创建了一个带有命令的sh文件:

export LD_LIBRARY_PATH=/path/to/libs

java -jar /path/to/appName.jar  

当我运行sh文件时,我的程序运行成功。

所以我的问题是为什么java.library.path不能用于ubuntu(linux)?是不是像java.library.path只适用于Windows?

java chromium-embedded
3个回答
1
投票

所以我的问题是为什么java.library.path不能用于ubuntu(linux)?是不是像java.library.path只适用于Windows?

它确实有用,我们经常使用它。使用-XshowSettings:properties启动应用程序并查看调试的搜索路径。

我们通常将库作为包部署到/usr/local/lib,因为这些库通常也被其他组件使用。在那里放置一个新库后不要忘记调用ldconfigexport LD_LIBRARY_PATH部分很多)。

据我记得,如果我没记错的话,只需添加-Djava.library.path文件夹即可。我会调查一下,然后告诉你澄清一下。

还请发布readlink -f /home/ubuntu/Desktop/binfile /home/ubuntu/Desktop/bin/libcef.soldd /home/ubuntu/Desktop/bin/libcef.so

更新:我将尝试解释为什么工作有效,为什么不工作。

让我们谈谈java.library.path。 VM使用此属性来查找库。看看java.lang.System#load*(String libName)作为参考。 java.library.path属性有一些预先设置的路径,下面显示了我的ubuntu盒子上的输出:

ortang@vbox-devel:~$ java -XshowSettings:properties
Property settings:
    ...
    java.library.path = /usr/java/packages/lib/amd64
        /usr/lib/x86_64-linux-gnu/jni
        /lib/x86_64-linux-gnu
        /usr/lib/x86_64-linux-gnu
        /usr/lib/jni
        /lib
        /usr/lib

请注意,使用此属性将覆盖现有属性。

ortwin@vbox-devel:~$ java -Djava.library.path=/some/other/folder:/yet/another/one -XshowSettings:properties
Property settings:
    ...
    java.library.path = /some/other/folder
        /yet/another/one

到现在为止还挺好。 JVM只查看该属性中定义的文件夹!

您使JVM加载的库很可能与其他库有依赖关系。请注意,操作系统会查找这些依赖项,就像任何其他共享库一样!

因此,要解决您的问题,您必须确保加载的库已解决其依赖关系!使用ldd进行调试。

LD_LIBRARY_PATH环境变量执行类似的工作,因为它添加了将用于OS查找库的路径。我不喜欢在生产环境中使用它。


2
投票

我对你的问题的最好猜测是你必须同时使用java.library.path和LD_LIBRARY_PATH。实际上,j.l.p用于java加载JNI库,而L_L_P用于操作系统加载共享库和任何依赖库。如果您的共享库依赖于其他路径中的其他库,则必须列出这些路径。


1
投票

似乎jcef没有找到它的依赖性,尝试ldd libcef.so |grep "not found"ldd libjcef.so |grep "not found"并修复丢失的库。在我的机器上(ubuntu 14.04)它错过了libudev.so.0,我的机器有/lib/x86_64-linux-gnu/libudev.so.1所以欺骗它由ln -s /lib/x86_64-linux-gnu/libudev.so.1 /lib/x86_64-linux-gnu/libudev.so.0sudo ldconfig重新加载ld缓存。

© www.soinside.com 2019 - 2024. All rights reserved.