【问题标题】:Unabled to run an old Java binary in a Linux 64bits无法在 64 位 Linux 中运行旧的 Java 二进制文件
【发布时间】:2016-08-13 18:24:54
【问题描述】:

我再次陷入(某种程度)几个月前已经解决的问题。我需要运行一个 Java 虚拟 POS,根据官方手册,它需要 Java VM 1.4.2,但环境是 Debian GNU/Linux 7 "Wheezy" amd64,我还没有找到该架构的特定版本(Solaris amd64 或 IA64 也不适合我的情况)。 Virtual POS 一直运行得非常好,但是在 Debian GNU/Linux 6 “Squeeze” i686 中(换句话说,在 32 位架构中)。我一直在尝试使用 Oracle JDK 8 64 位。我已经在 libOasisEMSec.so 上运行了 execstack,我再次从该站点 http://rpm.pbone.net/index.php3/stat/4/idpl/27875140/dir/opensuse_13.x/com/compat-32bit-2010.1.31-19.1.2.x86_64.rpm.html 下载了该文件,但为 64 位。编译很好,但是执行给了我以下错误:

# java -Djava.library.path=/var/www/vhosts/myvirtualshop.com/lib/Digest/linux -classpath /var/www/vhosts/myvirtualshop.com/lib/Digest/linux:/var/www/vhosts/myvirtualshop.com/lib/Digest/linux exampledigest

Java HotSpot(TM) 64-Bit Server VM warning: You have loaded library /var/www/vhosts/myvirtualshop.com/lib/Digest/linux/libOasisEMSec.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.
Exception in thread "main" java.lang.UnsatisfiedLinkError: /var/www/vhosts/myvirtualshop.com/lib/Digest/linux/libOasisEMSec.so: /var/www/vhosts/myvirtualshop.com/lib/Digest/linux/libOasisEMSec.so: wrong ELF class: ELFCLASS32 (Possible cause: architecture word width mismatch)
        at java.lang.ClassLoader$NativeLibrary.load(Native Method)
        at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
        at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1857)
        at java.lang.Runtime.loadLibrary0(Runtime.java:870)
        at java.lang.System.loadLibrary(System.java:1122)
        at OasisEMSecImp.<clinit>(OasisEMSecImp.java:9)
        at exampledigest.main(exampledigest.java:36)

这里最大的问题是:如何在 Debian Linux 64 位环境中运行这个旧的 Java 二进制文件?

【问题讨论】:

  • 你可以试试跑步吗...java -d32 -Djava.library.path=/var/www/vhosts/myvirtualshop.com/lib/Digest/linux -classpath /var/www/vhosts/myvirtualshop.com/lib/Digest/linux:/var/www/vhosts/myvirtualshop.com/lib/Digest/linux examplediges
  • 亚马逊有一个 32 位 Debian 压缩 AMI (ami-1212ef7b),您仍然可以从 Oracle (oracle.com/technetwork/java/javasebusiness/downloads/…) 获得 Java 1.4.x。不是最漂亮的解决方案,但它可能会让你继续前进。
  • @vidit:这是 JRE 1.8.0_77 64 位答案:“错误:此 Java 实例不支持 32 位 JVM。请安装所需的版本。”
  • @stdunbar:我已经试过了,也没用。

标签: java linux debian 32bit-64bit


【解决方案1】:

要在 64 位系统上运行 32 位程序,您需要启用 Multiarch:

 apt-get install ia32-libs -y

参见示例32bit firefox/thunderbird on debian amd64

如果您需要旧版本的 Sun Java

您需要从http://www.oracle.com/technetwork/java/archive-139210.html 下载它,自己解压缩,然后更新您的$PATH 以指向它。可能还有你的$JAVA_HOME 一些工具。

The oficial Installation Notes for Linux

  1. 确保已设置执行权限运行此命令:

    chmod    +x j2re-1_4_2_<version>-linux-i586.bin
    
  2. 运行自解压二进制文件。

    执行下载的文件,前面加上它的路径。为了 例如,如果文件在当前目录中,则在其前面加上“ ./”(如果“.”不在 PATH 环境变量中,则为必需):

    ./j2re-1_4_2_<version>-linux-i586.bin
    

关于系统偏好设置的注意事项:默认情况下,安装脚本 配置系统,以便系统的后备存储 首选项是在 Java 2 运行时环境的 安装目录。如果 J2RE 安装在网络安装的 驱动器,它和系统偏好可以导出共享 其他机器上的 Java 运行时环境。作为替代方案,根 用户可以在运行安装时使用 -localinstall 选项 脚本,如本例所示:

j2re-1_4_2_-linux-i586.bin -localinstall 这个选项会导致 要存储在 /etc 目录中的系统首选项 它们只能由在本地计算机上运行的 VM 共享。你必须 成为 -localinstall 选项的 root 用户。

【讨论】:

  • 所以,您告诉我的是,我可以在 Linux 64 位环境中使用 32 位 Java VM,因为这正是我最初所做的,但它不起作用。我是不是做错了什么?
  • 你需要启用多架构支持howtoforge.com/…
猜你喜欢
  • 2018-09-17
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
相关资源
最近更新 更多