Ich habe versucht, das aktuelle Oracle JRE auf einer VM unter NixOS zu installieren.
Nun passiert folgendes:
[michas@cc:~]$ tar xvzf jre-7u40-linux-x64.tar.gz |grep bin/java
jre1.7.0_40/bin/javaws
jre1.7.0_40/bin/java_vm
jre1.7.0_40/bin/java
[michas@cc:~]$ ls -l ./jre1.7.0_40/bin/java
-rwxr-xr-x 1 michas nogroup 7750 Aug 27 09:17 ./jre1.7.0_40/bin/java
[michas@cc:~]$ ./jre1.7.0_40/bin/java
bash: ./jre1.7.0_40/bin/java: No such file or directory
WTF? Die genannte Datei ist offensichtlich da. Was ist los?
Versuch weiter zu analysieren:
[michas@cc:~]$ strace ./jre1.7.0_40/bin/java
execve("./jre1.7.0_40/bin/java", ["./jre1.7.0_40/bin/java"], [/* 53 vars */]) = -1 ENOENT (No such file or directory)
write(2, "strace: exec: No such file or di"..., 40strace: exec: No such file or directory
) = 40
exit_group(1) = ?
+++ exited with 1 +++
[michas@cc:~]$ strace ./jre1.7.0_40/bin/jav
strace: Can't stat './jre1.7.0_40/bin/jav': No such file or directory
Ok, die Ausgabe einer wirklich fehlenden Datei sieht anders aus.
[michas@cc:~]$ file ./jre1.7.0_40/bin/java
./jre1.7.0_40/bin/java: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.9, BuildID[sha1]=a558f547fe0b95fdc6a109cb7d9692d6d7969794, not stripped
[michas@cc:~]$ file ~/t
/home/michas/t: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
Letzteres ist eine winzige selbstkompilierte Binärdatei, die ohne Probleme ausgeführt wird. Beide sehen sich sehr ähnlich. Daher scheint das Format der Binärdatei selbst in Ordnung zu sein.
[michas@cc:~]$ ldd ./jre1.7.0_40/bin/java
/run/current-system/sw/bin/ldd: line 116: ./jre1.7.0_40/bin/java: No such file or directory
Es scheint ein Problem mit den benötigten gemeinsam genutzten Bibliotheken zu geben.
Was ist los und wie kann ich das beheben?
Antworten:
Normalerweise können Sie unter NixOS keine Binärdateien ausführen. Sie müssen entweder einige Umgebungsvariablen festlegen oder mit patchElf gepatcht werden. Ich gehe davon aus, dass Sie Java mit dem nix-Paketmanager installieren und ausführen können. Sie können wahrscheinlich auch eine geeignete Umgebung erstellen, um sie mit myEnvFun auszuführen.
quelle
patchelf
zum Ausführen einer Binärdatei in einer Nix-Umgebung für diejenigen von Nutzen sein, die nach einer Lösung suchen. In diesem Fall handelt es sich jedoch um die "aktive" Nix-Umgebung des Benutzers in einer Einzelbenutzer-Nix-Installation unter CentOS. Ihre Anforderungen können unterschiedlich sein versioniert, gehasht im nix store).Es sieht so aus, als hätte nixos ein Paket für oracle jre7 .
Wenn Sie einen benutzerdefinierten nix-Ausdruck erstellen möchten, um jre oder jdk zu installieren, ist es möglicherweise eine gute Idee, sich den vorhandenen nix-Ausdruck für jdk7 / jre7 anzusehen .
quelle