Linux环境JNA加载动态库问题总结

最近项目涉及JNA加载动态库,因为Linux操作系统对文件权限控制比Win严格,所以很多问题在Win没出现,在Linux出现。

问题:linux环境下web应用通过jna加载so库失败,无报错,无崩溃。

可能原因1:

Web应用启动用户对So库所在目录无读写执行权限

解决方法1:

赋权限,chmod

解决方法2:

Web应用一般自动解压so库到${user.home}或者${tmp},通过启动变量给${user.home},${tmp}变量赋值控制解压到有权限的目录下。

        例如:tomcat中间件

        修改catalina.sh

        找到执行分支的JAVA_OPT,修改为下面示例,保证web应用启动用户对/xxx/xxx/目录有读写执行。

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Duser.home=/xxx/xxx/"

可能原因2:

jna加载调用动态库时会在tmp目录产生jna.xxxxxxxxxxxxxx的临时文件,若启动用户对tmp目录无对应权限会导致加载调用失败。

解决方法1:

找出jna产生tmp目录路径,chmod赋予权限。但是tmp路径不好查,不同用户可能也不一致。可以使用第二种解决方法。

解决方法2:

通过修改启动变量${jna.tmpdir},${java.io.tmpdir}指定tmp目录,${jna.debug_load}变量表示输出jna加载调so用过程的信息。

        例如:tomcat中间件

        修改catalina.sh

        找到执行分支的JAVA_OPT,修改为下面示例,保证web应用启动用户对/xxx/tmp/目录有读写执行。

JAVA_OPTS="$JAVA_OPTS $JSSE_OPTS -Djna.tmpdir=/xxx/tmp/ -Djava.io.tmpdir=/xxx/tmp/ -Djna.debug_load=true"

可能原因3:

Jdk版本与jna版本不适配,这种情况加载失败会出现明显的错误提示,自行更新版本即可。

你可能感兴趣的:(linux,运维,服务器)