我正在开发一个需要一些库的java组件,例如用于Windows系统的.dll
和用于Linux系统的.so
文件。所以我在netbeans中准备了一个java应用程序,并添加了一些依赖jar并构建项目。
在Windows上执行:
当我尝试使用命令java -jar appName.jar
在Windows系统上运行jar文件时,我得到java.lang.UnsatisfiedLinkError
所以我在java -Djava.library.path=full\\path\\to\\libs -jar appName.jar
执行时指定了java.library.path并且它在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使用库路径bin初始化Thread [AWT-EventQueue-0,6,main] 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吗?
答案 0 :(得分:2)
我对你的问题的最好猜测是你必须同时使用java.library.path 和 LD_LIBRARY_PATH。实际上,j.l.p用于java加载JNI库,而L_L_P用于操作系统加载共享库和任何依赖库。如果您的共享库依赖于其他路径中的其他库,则必须列出这些路径。
答案 1 :(得分:1)
所以我的问题是为什么java.library.path不能用于ubuntu(linux)?是java.library.path只适用于Windows吗?
它确实有用,我们经常使用它。使用-XshowSettings:properties
启动您的应用程序,并查看调试的搜索路径。
我们通常将库作为包部署到/usr/local/lib
,因为这些库通常也被其他组件使用。在那里放置一个新库之后不要忘记给ldconfig
打电话(对export LD_LIBRARY_PATH
部分来说太多了。)
据我记得,如果我没记错的话,只需添加-Djava.library.path
文件夹即可 就足够了。我会调查并稍后告诉你澄清。
另请发布readlink -f /home/ubuntu/Desktop/bin
,file /home/ubuntu/Desktop/bin/libcef.so
和ldd /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 :(得分: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.0
和sudo ldconfig
来重新加载ld缓存。
答案 3 :(得分:0)
我遇到了同样的问题,我使用了“-Djava.library.path”,但它不起作用。 我添加了“-Dsun.boot.library.path”作为尝试,它有效!
试试:
java -Dsun.boot.library.path=/path/to/libs -jar appName.jar