从FAT32 USB在Linux中启动JRE

时间:2014-03-01 09:11:57

标签: java linux cross-platform launch fat32

我在USB上安装了一个Java应用程序,用户应该可以从任何操作系统运行该应用程序。

为此,

  1. 我正在将USB JRE实例与我的应用程序一起打包。
  2. 我在USB上有一个FAT32文件系统。
  3. 然而,问题是,FAT32没有执行(“+ x”)权限的概念。虽然我可以启动shell脚本,如下所示:

    $ sh /path/to/fat32-usb/helloWorld.sh
    

    ,虽然我可以启动一个简单的ELF二进制文件,如下所示:

    $ /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/helloWorld
    

    ,我似乎无法启动Java ELF程序。我收到这些错误:

    Error: could not find libjava.so
    Error: Could not find Java SE Runtime Environment.
    

    在启动java之前,我尝试按如下方式设置这些环境变量:

    export JAVA_HOME=/path/to/fat32-usb/jre
    export LD_LIBRARY_PATH="$JAVA_HOME/lib/amd64:.:$LD_LIBRARY_PATH" 
    export PATH="$JAVA_HOME/bin:.:$PATH"
    

    我还尝试从java目录中启动$JAVA_HOME/bin。最后,我还尝试将libXXX.so中的所有$JAVA_HOME/lib/amd64/复制到$JAVA_HOME/bin,希望它们能够以某种方式从当前目录.中获取。

    但没有任何效果。

    修改

    以下是strace输出的最后几行:

    $ strace -vfo /tmp/java.strace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ...
    ...
    readlink("/proc/self/exe", "/lib/x86_64-linux-gnu/ld-2.17.so", 4096) = 32
    write(2, "Error: could not find libjava.so", 32) = 32
    write(2, "\n", 1)                       = 1
    write(2, "Error: Could not find Java SE Ru"..., 50) = 50
    write(2, "\n", 1)                       = 1
    exit_group(2)                           = ?
    

    EDIT2

    这是ltrace的输出(只是一行!):

    $ ltrace -s 120 -e '*' -ifo /tmp/java.ltrace /lib64/ld-linux-x86-64.so.2 /path/to/fat32-usb/jre ...
    30913 [0xffffffffffffffff] +++ exited (status 2) +++
    

    编辑3

    这是ltrace摘录围绕 ext4分区上的Java加载libjava.so (而不是问题FAT32分区),我可以正常加载:

    5525 [0x7f7627600763] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 4096, "%s/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 46
    5525 [0x7f762760076d] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/lib/amd64/libjava.so", 0)                                                                 = -1
    5525 [0x7f762760078d] libjli.so->snprintf( <unfinished ...>
    5525 [0x3085246bdb] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39)                                                                                           = 0
    5525 [0x3085246be3] libc.so.6->(0, 0x7fffffd8, 0x7f7627607363, 39)                                                                                           = 0
    5525 [0x7f762760078d] <... snprintf resumed> "/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 4096, "%s/jre/lib/%s/libjava.so", "/home/aaa/bbb/jdk1.7.0_40", "amd64") = 50
    5525 [0x7f7627600797] libjli.so->access("/home/aaa/bbb/jdk1.7.0_40/jre/lib/amd64/libjava.so", 0)                                                             = 0
    

    这是健康/加载strace的{​​{1}}输出。

    java

0 个答案:

没有答案