
我嘗試在運行 NixOS 的 VM 上安裝當前的 oracle jre。
現在發生以下情況:
[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
搞什麼?指定的文件顯然在那裡。到底是怎麼回事?
嘗試進一步分析:
[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
好的,真正遺失的檔案的輸出看起來有所不同。
[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
後者是一個小型的自編譯二進位文件,運行沒有問題。兩者看起來非常相似。因此,格式化二進位檔案本身似乎沒問題。
[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
似乎所需的共享庫存在問題。
這是怎麼回事?
答案1
您通常無法在 NixOS 中執行二進位文件,它們要么需要設定一些環境變量,要么需要使用 patchElf 進行修補。我假設您可以使用 nix 套件管理器安裝並執行 java。您或許也可以使用 myEnvFun 創建一個合適的環境來運行它。
答案2
看起來 nixos 有一個軟體包甲骨文jre7。
如果您想建立自訂 nix 表達式來安裝 jre 或 jdk,那麼查看現有的可能是個好主意jdk7/jre7 的 nix 表達式。