libjli.so를 찾을 수 없습니다. 루트 권한 없이 Java를 설치하는 방법은 무엇입니까?

libjli.so를 찾을 수 없습니다. 루트 권한 없이 Java를 설치하는 방법은 무엇입니까?

SSH를 통해 액세스할 수 있지만 루트 액세스는 필요 없는 간단한 웹 호스팅 서버에서 Java를 실행하고 싶습니다. jdk linux/x64 tarball을 다운로드하고 압축을 풀었지만 java 바이너리를 실행하면 다음이 생성됩니다.

jdk-14.0.1/bin/java: error while loading shared libraries: libjli.so:
cannot open shared object file: No such file or directory

파일이 하위 디렉터리에 libjli.so있지만 jdk-14.0.1/libJava 바이너리가 해당 파일을 찾을 수 없는 것 같습니다.

실행 중인 strace jdk-14.0.1/bin/java출력:

execve("jdk-14.0.1/bin/java", ["jdk-14.0.1/bin/java"], [/* 17 vars */]) = 0
brk(0)                                  = 0x7fa16e241000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fa16d87c000
readlink("/proc/self/exe", 0x7fffb04bc970, 4096) = -1 ENOENT (No such file or directory)
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY)      = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=24961, ...}) = 0
mmap(NULL, 24961, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7fa16d875000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/tls/x86_64/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls/x86_64", 0x7fffb04bd280) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/tls/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/tls", 0x7fffb04bd280) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/x86_64/libz.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64-linux-gnu/x86_64", 0x7fffb04bd280) = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libz.so.1", O_RDONLY) = 3
read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0\340#\0\0\0\0\0\0"..., 832) = 832
fstat(3, {st_mode=S_IFREG|0644, st_size=92752, ...}) = 0
mmap(NULL, 2187792, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0x7fa16d448000
mprotect(0x7fa16d45e000, 2093056, PROT_NONE) = 0
mmap(0x7fa16d65d000, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x15000) = 0x7fa16d65d000
close(3)                                = 0
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
open("/lib/x86_64-linux-gnu/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/tls/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/x86_64-linux-gnu/tls/x86_64", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/tls/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/x86_64-linux-gnu/tls", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/x86_64-linux-gnu/x86_64", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64-linux-gnu/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/x86_64-linux-gnu", {st_mode=S_IFDIR|0755, st_size=36864, ...}) = 0
open("/lib/tls/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib/tls/x86_64", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/lib/tls/libjli.so", O_RDONLY)    = -1 ENOENT (No such file or directory)
stat("/lib/tls", 0x7fffb04bd250)        = -1 ENOENT (No such file or directory)
open("/lib/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/lib/x86_64", 0x7fffb04bd250)     = -1 ENOENT (No such file or directory)
open("/lib/libjli.so", O_RDONLY)        = -1 ENOENT (No such file or directory)
stat("/lib", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
open("/usr/lib/tls/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/tls/x86_64", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/usr/lib/tls/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/tls", 0x7fffb04bd250)    = -1 ENOENT (No such file or directory)
open("/usr/lib/x86_64/libjli.so", O_RDONLY) = -1 ENOENT (No such file or directory)
stat("/usr/lib/x86_64", 0x7fffb04bd250) = -1 ENOENT (No such file or directory)
open("/usr/lib/libjli.so", O_RDONLY)    = -1 ENOENT (No such file or directory)
stat("/usr/lib", {st_mode=S_IFDIR|0755, st_size=20480, ...}) = 0
writev(2, [{"jdk-14.0.1/bin/java", 19}, {": ", 2}, {"error while loading shared libra"..., 36},
{": ", 2}, {"libjli.so", 9}, {": ", 2}, {"cannot open shared object file", 30}, {": ", 2},
{"No such file or directory", 25}, {"\n", 1}], 10jdk-14.0.1/bin/java: error while loading shared
libraries: libjli.so: cannot open shared object file: No such file or directory
) = 128
exit_group(127)                         = ?

분명히 Java는 쓰기 권한이 없는 곳에서 libjli.so 공유 라이브러리 파일을 검색하고 있습니다.

인터넷 검색 후 비슷한 질문을 많이 찾았지만 루트 액세스가 필요하기 때문에 제공된 팁을 사용할 수 없었습니다. 그러나 나는 루트 액세스 부족이 문제의 핵심이라고 생각하지 않습니다. 왜냐하면 내 홈 Linux 시스템에서 동일한 tarball의 압축을 풀면 동일한 Java 바이너리가 문제 없이 실행되거나 루트 액세스 없이 실행되기 때문입니다. 그래서 저는 몇 가지 다른 전제 조건, 즉 서버가 없다고 가정합니다.

서버에서 uname -aYield 를 실행하는 Linux [...] 3.2.0-6-amd64 #1 SMP Debian 3.2.102-1 x86_64 GNU/Linux것은 나에게 놀라운 일이 아닙니다.

물론 도움을 주시면 정말 감사하겠습니다. 더 많은 정보를 제공해 드리겠습니다. 미리 감사드립니다.

답변1

첫째, libjli.so라이브러리는 lib디렉토리가 아닌 bin디렉토리에 있어야 합니다. 가지고 있는 방법에 따라 두 위치 중 하나에 있어야 합니다.

jdk-14.0.1/lib/
jdk-14.0.1/jli/

그런 다음 PATH 및 JAVA_HOME을 사용하여 환경에 해당 위치를 추가해야 합니다. .bashrc에 다음 줄을 추가하고 새 셸 세션을 시작하세요.

export PATH=/home/presencia/jdk-14.0.1/bin:$PATH

export LD_LIBRARY_PATH=/home/presencia/jdk-14.0.1/lib:$LD_LIBRARY_PATH

export JAVA_HOME=/home/presencia/jdk-14.0.1

관련 정보