Saya mencoba untuk menginstal oracle jre saat ini pada VM yang menjalankan NixOS.
Sekarang yang berikut ini terjadi:
[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? File bernama jelas ada di sana. Apa yang sedang terjadi?
Mencoba menganalisis lebih lanjut:
[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, output dari file yang benar-benar hilang terlihat berbeda.
[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
Yang terakhir adalah biner yang dikompilasi sendiri kecil berjalan tanpa masalah. Keduanya terlihat sangat mirip. Karenanya memformat biner itu sendiri tampaknya baik-baik saja.
[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
Sepertinya ada masalah terkait perpustakaan bersama yang dibutuhkan.
Apa yang sedang terjadi dan bagaimana cara memperbaikinya?
Jawaban:
Anda biasanya tidak dapat menjalankan file biner di NixOS, mereka memerlukan beberapa variabel lingkungan yang ditetapkan atau ditambal dengan patchElf. Saya berasumsi Anda dapat menginstal dan menjalankan java menggunakan manajer paket nix. Anda mungkin juga dapat membuat lingkungan yang cocok untuk menjalankannya menggunakan myEnvFun.
sumber
patchelf
untuk menjalankan biner di lingkungan nix dapat bermanfaat bagi mereka yang mencari solusi. Tetapi kasus itu adalah lingkungan nix "aktif" pengguna dalam instalasi nix satu pengguna di bawah CentOS, kebutuhan Anda mungkin berbeda (IIC pendekatan yang lebih lincah adalah untuk merujuk bukan ke lingkungan yang terhubung "aktif", tetapi lebih ke spesifik versi, hash satu di nix store).Sepertinya nixos memiliki paket untuk oracle jre7 .
Jika Anda ingin membuat ekspresi nix khusus untuk menginstal jre atau jdk maka mungkin ide yang baik untuk melihat ekspresi nix yang ada untuk jdk7 / jre7 .
sumber