Problém
„java -version“ se ukončí s chybovou zprávou „chyba při načítání sdílených knihoven:libjli.so:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář“ při pokusu o spuštění JVM.
Případ 1
Problém nastává, pokud je spuštěn pod normálním uživatelem nebo pokud je spuštěn pod uživatelem root
$ java -version [PATH_TO]/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Případ 2
Problém je pouze v případě, že jej provozuje běžný uživatel. Není problém, pokud je spuštěn pod uživatelem root.
Pod normálním uživatelem:
$ java -version [JAVA_HOME]/bin/java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
Pod kořenem:
# [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)
Řešení pro případ 1
Buď byl do složky natvrdo zkopírován pouze binární soubor Java (např. /usr/bin/) bez zkopírování zbytku adresářů JRE nebo JDK, nebo byl ve složce vytvořen pouze pevný odkaz na binární soubor Java (např. /usr/bin/) .
# cp [JAVA_HOME]/jre/bin/java /usr/bin/
Pokud binární soubor spouštěče Java nemůže najít soubory JRE/JDK, nepodaří se spustit JVM. Soubor libjli.so je dynamicky propojen s binárním souborem Java. Je to jedna z prvních knihoven, kterou se Java launcher pokouší načíst. Aby bylo možné správně spustit Java launcher, musí být schopen číst všechny přidružené knihovny Java.
Existují 2 způsoby, jak to lze vyřešit:
Řešení 1
Pokud chcete volat Javu ze složky /usr/bin, vytvořte symbolický odkaz namísto pevného odkazu nebo kopie.
# sudo ln -s [path to the JRE's java binary] /usr/bin/javaPoznámka :Systémy Linux, které podporují příkaz „update-alternatives“, by měly místo vytváření symbolického odkazu použít níže uvedené řešení 2.
Řešení 2
použijte příkaz update-alternatives podle příspěvku níže k nastavení správné cesty Java.
Příkaz „java“ nespustí JVM, který byl nainstalovánŘešení pro případ 2
Zde jsou 2 scénáře:
Scénář 1
„setcap ” byl použit k udělení řádného oprávnění binárnímu souboru Java, který umožňuje nepřivilegovaným uživatelům zvláštní práva. Chcete-li například otevřít porty nižší než 1024:
# setcap cap_net_bind_service=+ep/bin/java
Při zvýšení oprávnění spustitelného souboru se runtime loader (rtld), lépe známý jako ld.so, nepropojí s knihovnami v nedůvěryhodných cestách. Toto je způsob, jakým byl navržen ld.so(1). Pokud je třeba spustit takový spustitelný soubor, musí být cesty k přidruženým knihovnám pro zvýšený spustitelný soubor přidány k důvěryhodným cestám ld.so.
Scénář 2
JDK/JRE byl nainstalován pod jiným uživatelským účtem (např. root) a oprávnění ke čtení světa byla explicitně odebrána buď pouze z libjli.so, nebo dokonce z celé adresářové struktury JDK nebo JRE. Příklad:
# chmod -R o-r [JAVA_HOME]
Pokud uživatel, který spouští Javu, nemá oprávnění ke čtení knihovny libjli.so, Java selže. Je to proto, že libjli.so je dynamicky propojeno s binárním souborem Java. Java musí být schopna číst všechny své dynamicky propojené knihovny, aby mohla správně začít.
Řešení pro scénář 1
Zde jsou 2 řešení:
1. Znovu odeberte funkci z binárního kódu Java:
# setcap -r [JAVA_HOME]/bin/java
Ověřte, že java -version nyní funguje:
$ [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. Vytvořte soubor, jako je tento, s cestou k libjli.so:
$ cat /etc/ld.so.conf.d/java.conf [JAVA_HOME]/jre/lib/amd64/jliPoznámka :Pokud používáte 32bitové JRE, nahraďte amd64 i386.
Tím se tato cesta přidá k cestě důvěryhodného uživatele, kterou bude ld.so používat. Může být vyžadováno vytvoření mezipaměti za běhu. Ověřte, zda to ld.so vidí následujícím způsobem. Příkazy musí běžet jako root. Může být nutné restartovat.
# ldconfig | grep libjli libjli.so -> libjli.so .......
Ověřte, že java -version nyní funguje:
$ [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)
Řešení pro scénář 2
Obnovte oprávnění ke čtení, aby uživatel mohl číst libjli.so a další soubory z adresářů JDK/JRE. Například:
# chmod -R o+r [JAVA_HOME]
Ověřte, že java -version nyní funguje:
$ [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)