Estou tentando iniciar o java:
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
$ ldd /usr/lib/jvm/java-6-openjdk/jre/bin/java
linux-gate.so.1 => (0xb779f000)
libz.so.1 => /usr/lib/libz.so.1 (0xb7780000)
libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7767000)
libjli.so => /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/libjli.so (0xb7762000)
libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb775e000)
libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7603000)
/lib/ld-linux.so.2 (0xb77a0000
$ ls /usr/lib/jvm/java-6-openjdk/jre/bin/../lib/i386/jli/
libjli.so
Mas o java funciona como root:
$ sudo java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~lenny1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)
UPD:
/ usr / lib / jvm / java-6-openjdk / jre / bin / java é realmente meu comando java:
$ type java
java is hashed (/usr/bin/java)
$ ls -l /usr/bin/java
lrwxrwxrwx 1 root root 22 Jul 14 10:15 /usr/bin/java -> /etc/alternatives/java
$ ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 40 Jul 14 10:36 /etc/alternatives/java -> /usr/lib/jvm/java-6-openjdk/jre/bin/java
UPD2:
Eu também tentei definir PATH raiz:
$ sudo su
# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
# exit
$ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ java -version
java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory
UPD3:
Eu tentei:
# comm -3 <(declare | sort) <(declare -f | sort)
sob raiz. Mas não há variáveis de ambiente utilizáveis para java.
UPD4:
strace -f java -version
resultado: http://dumpz.org/67368/
debian
permissions
java
dynamic-linking
aetaur
fonte
fonte
strace -f java -version
e publique a saída.Respostas:
O executável que você está executando procura bibliotecas em um rpath , além do caminho normal de pesquisa da biblioteca. O rpath aqui é
$ORIGIN/../lib/i386/jli:$ORIGIN/../jre/lib/i386/jli
. Normalmente,$ORIGIN
deve ser substituído pela localização do executável aqui/usr/lib/jvm/java-6-openjdk/jre/bin
.Aqui,
$ORIGIN
não está sendo substituído. O recurso é desativado em executáveis executando com privilégios extras (setuid, setgid ou setpcap), porque, caso contrário, você poderá injetar uma biblioteca diferente e, portanto, executar código arbitrário com privilégios elevados. (Consulte este artigo para obter uma explicação mais detalhada.) O problema de segurança foi descoberto relativamente recentemente; no Debian, ele foi corrigido no DSA-2122-1 ; portanto, antes de fazer o upgrade paralibc6-2.7-18lenny6
, seujava
executável provavelmente funcionaria.O sintoma indica que
java
está sendo executado com privilégios adicionais. Este não é o caso em uma instalação Debian normal. Certifique-se de que/usr/lib/jvm/java-6-openjdk/jre/bin/java
é o modo de 755 e não tem qualquer capacidade (getcap /usr/lib/jvm/java-6-openjdk/jre/bin/java
esetcap -r …
para remover os recursos se houver).(Resposta original, que pode ser útil se você achar que
java
funciona como raiz, mas não como outros usuários, e se você invocar binários diferentes.)Minha aposta é que você tem alguma outra
java
versão anterior no seuPATH
(sudo
altera oPATH
). Verifique o quetype java
diz - provavelmente é uma versão Java diferente para quaisldd /path/to/bin/java
relatórioslibjli.so => not found
.E especulo que o motivo que esta versão Java não consegue encontrar
libjli.so
é que ela está procurando por um rpath (caminho de pesquisa de biblioteca armazenado no executável) que não corresponde ao modo como está instalado. Se você possui ojava
binário/some/where/bin/java
e ele possui um rpath relativo (que é o caminho do Sun JDK e OpenJDK), a biblioteca deve estar/some/where/lib/i386/jli/libjli.so
(assumindo uma arquitetura i386). Se o rpath for absoluto, você deverá colocarlibjli.so
no local exato especificado ou definirLD_LIBRARY_PATH
para incluir ondelibjli.so
está.fonte
type java
export LD_LIBRARY_PATH=/usr/lib/jvm/java-6-openjdk/jre/lib/i386/jli/
, mas tenho o mesmo erro.Eu baixei "1.7.0_60" de java.com em
.tar.gz
formato e instalei/usr/local/jre1.7.0_60
. Em seguida, criei um link físico/usr/local/bin/java
e recebi o erro descrito acima.Alterar o link físico para um link simbólico corrigiu o problema.
Versão curta:
É ruim.
É bom.
fonte
Tente encontrar o executável java dentro do mesmo caminho
libjli.so
e usar isso.Por exemplo, eu encontrei
libjli.so
em/usr/lib/jvm/java-7-oracle/jre/lib/amd64/jli/libjli.so
, então eu useie encontrou o executável em
/usr/lib/jvm/java-7-oracle/bin/java
. Então, eu apagueijava
a partir/usr/bin
e apenas simbolicamente acima em executável/usr/bin
.fonte
Se o erro ocorrer devido ao uso do setcap no executável Java, consulte
Como fazer com que o Oracle java 7 funcione com setcap cap_net_bind_service + ep e http://bugs.java.com/view_bug.do?bug_id=7157699
que responde a essa pergunta em detalhes.
ps. Em nosso projeto, tivemos que fazer
para permitir que o binário java abra portas tcp / udp abaixo de 1024. Acima, o java "bug" 7157699 fornece uma solução rápida, adicionando o diretório em que libjli.so está localizado em um arquivo conf no caminho /etc/ld.so.conf.d e, em seguida, chamando o ldconfig para armazenar novamente em cache as bibliotecas. Assumindo o Linux.
fonte
Verifique as permissões nesse arquivo. Eles devem se parecer
0644/-rw-r--r--
. Caso contrário, reinstaleopenjdk-6-jre-headless
, porque isso significaria que alguém mexeu com as permissões.fonte
ldd
reportarialibjli.so => not found
se não conseguisse ler o.so
(pelo menos é o que acontece com o GLibc 2.11).Semelhante à resposta de Tshepang, forcei
libjli.so
o caminho de pesquisa da biblioteca:Para referência, meu ambiente de construção usa o github: flexiondotorg / oab-java6 no Ubuntu 10.04 / 64-bit.
fonte
Por algum motivo estranho,
/usr/bin/java
não estava mais apontando para a instalação do java. Não faço ideia de como isso aconteceu. Confirmei isso executando:O que me deu o seguinte
Portanto, a solução foi remover o java
/usr/local/bin
e criar um novo link simbólico:fonte
Eu tive o mesmo erro.
A maneira mais simples de resolver isso é simplesmente remover todos os jdks e jres e também o executável / usr / bin / java, se houver.
E, em seguida, reinstale o jdk.
Isso resolveu o problema para mim. Enquanto outros métodos não.
fonte
Para quem tenta iniciar um aplicativo Java a partir de um serviço systemd e obtém o mesmo erro, relacionado ao
libjli.so
biblioteca, continue lendo.Existe um bug em aberto para isso no Fedora atualmente:
Bug 1358476 - SELinux impedindo o systemd de executar serviços baseados em java
O resultado disso é que o SELinux está restringindo silenciosamente o acesso a essa biblioteca. Como não há mensagem negada pelo AVC, você não pode corrigi-la com contexto ou alteração de política.
Descobri que adicionar um arquivo
/etc/ld.so.conf.d/
que contém a pasta do seulibjli.so
arquivo é uma solução alternativa:E então corra
Mas isso é bem bagunçado ...
Uma opção melhor é usar
/bin/bash -c
para iniciar o processo Java no seu arquivo de serviço:Até que o problema seja resolvido ....
fonte
/bin/bash
? O que acontece se você usar/bin/sh
?