GNU/Linux >> Znalost Linux >  >> Linux

"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ář" chyba "java -version" při spuštění

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/java
Pozná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/jli
Pozná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)


Linux
  1. Jak opravit chybu instalace Pythonu při načítání sdílených knihoven:libssl.so.1.0.0? [vyřešeno]

  2. Mkdir:Nelze vytvořit adresář:Žádný takový soubor nebo adresář?

  3. Rpm:Chyba při načítání sdílených knihoven:Libz.so.1:Nelze otevřít soubor sdíleného objektu:Žádný takový soubor

  1. libstdc++.so.5:nelze otevřít soubor sdíleného objektu - ale knihovna je nainstalovaná a aktuální

  2. chyba při načítání sdílených knihoven:libncurses.so.5:

  3. Závažná chyba:cuda.h:Žádný takový soubor nebo adresář

  1. Jak vyřešit chybu „nelze otevřít soubor sdíleného objektu“ v distribucích Linuxu založených na Ubuntu

  2. Chyba při načítání sdílených knihoven libcrypto.so.1.1 – OpenSSL [Oprava]

  3. ImportError:libcblas.so.3:nelze otevřít soubor sdíleného objektu:Žádný takový soubor nebo adresář