情况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个解决方案:

  1. 再次从 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)
  1. 创建一个像这样的文件,路径为 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)
之路教程 https://onitr oad .com

情况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

java报错: libjli.so cannot open shared object file

问题

尝试启动 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)
日期:2020-09-17 00:14:01 来源:oir作者:oir