最近项目涉及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版本不适配,这种情况加载失败会出现明显的错误提示,自行更新版本即可。