情况2 的解决方案
这里有2种情形:
情形1
“setcap”命令已用于授予 Java 二进制文件适当的权限,以允许非特权用户特殊权限。
例如,要打开低于 1024 的端口:
# setcap cap_net_bind_service=+ep <JAVA_HOME>/bin/java
当提升可执行文件的权限时,运行时加载程序 (rtld),即 ld.so,不会与不受信任路径中的库链接。
这就是 ld.so(1) 的设计方式。
如果需要运行此类可执行文件,则必须将提升的可执行文件的关联库的路径添加到 ld.so 的受信任路径中。
情形2
JDK/JRE 安装在不同的用户帐户(例如 root)下,并且仅从 libjli.so 甚至整个 JDK 或者 JRE 目录结构中明确删除了全局读取权限。
例子:
# chmod -R o-r [JAVA_HOME]
如果启动 Java 的用户没有读取 libjli.so 库的权限,Java 将失败。
这是因为 libjli.so 动态链接到 Java 二进制文件。
Java 必须能够读取其所有动态链接的库才能正常启动。
情形1的解决方案
这里也有2个解决方案:
- 再次从 Java 二进制文件中删除功能:
# setcap -r [JAVA_HOME]/bin/java
验证 java -version 现在是否正常工作:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
- 创建一个像这样的文件,路径为 libjli.so:
$ cat /etc/ld.so.conf.d/java.conf [JAVA_HOME]/jre/lib/amd64/jli
注意:如果我们使用 32 位 JRE,请将 amd64 替换为 i386.
这会将该路径添加到 ld.so 将使用的受信任用户路径。
可能需要构建运行时缓存。
通过执行以下操作验证 ld.so 是否看到它。
这些命令需要以 root 身份运行。
可能需要重新启动。
# ldconfig | grep libjli libjli.so -> libjli.so .......
验证 java -version 现在是否正常工作:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
情况2的解决方案
恢复读取权限,以便用户可以读取 JDK/JRE 目录中的 libjli.so 和其他文件。
例如:
# chmod -R o+r [JAVA_HOME]
验证 java -version 现在是否正常工作:
$ [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
情况1 的解决方案
或者只将 Java 二进制文件硬复制到文件夹(例如 /usr/bin/)而不复制其余的 JRE 或者 JDK 目录,或者只在文件夹中创建 Java 二进制文件的硬链接(例如 /usr/bin/) .
# cp [JAVA_HOME]/jre/bin/java /usr/bin/
如果 Java 启动程序二进制文件找不到 JRE/JDK 的文件,它将无法启动 JVM。
libjli.so 动态链接到 Java 二进制文件。
它是 Java 启动器尝试加载的首批库之一。
Java 启动器需要能够读取所有与 Java 相关的库才能正常启动。
有两种方法可以解决这个问题:
解决方案1
如果要从 /usr/bin 文件夹调用 Java,请创建符号链接而不是硬链接或者副本。
# sudo ln -s [path to the JRE's java binary] /usr/bin/java
注意:支持“update-alternatives”命令的 Linux 系统应该使用下面的解决方案 2,而不是创建符号链接。
解决方案2
按照下面的帖子使用 update-alternatives 命令来设置正确的 java 路径。
“java”命令不运行已安装的JVM
问题
尝试启动 JVM 时,执行“java -version”退出并显示错误消息:
"error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory"
“加载共享库时出错:libjli.so:无法打开共享对象文件:没有此类文件或者目录”。
情况1
问题是在普通用户下运行还是在root用户下运行
$ java -version [PATH_TO]/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
情况2
只有当它由普通用户运行时才会出现问题。
如果在root用户下运行是没有问题的。
普通用户下:
$ java -version [JAVA_HOME]/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
使用root用户:
# [JAVA_HOME]/bin/java -version java version "1.8.0_25" Java(TM) SE Runtime Environment (build 1.8.0_25-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)