You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为Java程序添加Socket权限后启动失败:无法找到libjli.so

问题解决:添加setcap后Java无法找到libjli.so

问题原因

给Java可执行文件添加cap_net_raw=+ep权限后,Linux安全机制会忽略该二进制文件的RPATH配置——也就是它原本能自动找到相对路径下libjli.so的机制失效了,所以即使文件实际存在,系统也找不到它。

解决方案

方案一:临时设置LD_LIBRARY_PATH

修改启动脚本,在执行Java命令前指定库路径,让系统能定位到libjli.so:

MY_JAVA_PATH=/home/dds/jdk-11.0.18+10
echo "Using java [${MY_JAVA_PATH}]"
JAVA=${MY_JAVA_PATH}/bin/java
echo "allowing ${JAVA} java to open sockets"
# 赋予Java二进制cap权限
sudo setcap cap_net_raw=+ep ${JAVA}
# 配置库路径,指向libjli.so所在目录
export LD_LIBRARY_PATH=${MY_JAVA_PATH}/lib/jli:$LD_LIBRARY_PATH
# 启动程序
${JAVA} --module-path=javafx17-sdk/lib --add-modules=javafx.base,javafx.controls -jar myprogram.jar

方案二:给libjli.so添加对应cap权限(不推荐)

当主二进制文件带有cap权限时,依赖的共享库也需要具备相同权限才能被加载,执行以下命令:

sudo setcap cap_net_raw=+ep ${MY_JAVA_PATH}/lib/jli/libjli.so

之后直接运行原启动脚本即可。但这种方式会给库文件也赋予权限,存在额外安全风险,不建议生产环境使用。

方案三:用capsh间接启动(更安全)

通过capsh工具临时给Java进程赋予权限,避免修改Java二进制本身的权限:
创建一个wrapper脚本(比如run_program.sh):

#!/bin/bash
MY_JAVA_PATH=/home/dds/jdk-11.0.18+10
JAVA=${MY_JAVA_PATH}/bin/java
# 用capsh临时赋予进程cap_net_raw权限并启动程序
capsh --caps="cap_net_raw+ep" -- -c "${JAVA} --module-path=javafx17-sdk/lib --add-modules=javafx.base,javafx.controls -jar myprogram.jar"

给脚本加执行权限:

chmod +x run_program.sh

之后运行./run_program.sh即可启动程序。这种方式不会改动Java二进制文件的权限,安全性更高。

内容的提问来源于stack exchange,提问作者DDS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:55:42