在Redhat 5上运行JavaFX应用程序

时间:2014-06-26 19:18:04

标签: javafx javafx-8

从我的previous question,我知道RedHat 5.8中不支持JavaFX,这意味着,即使我在Linux上安装了Java 8(jdk1.8.0_05),在win7中创建的JAR文件也可以使用。通过java -jar helloworld.jar执行。这是否意味着没有办法在这台机器上运行JavaFX jar?

2 个答案:

答案 0 :(得分:2)

在RHEL5上运行JavaFX应用程序的问题是附带的glib版本,操作系统不够新。那么,诀窍是提供该库的更新版本以及依赖于它的所有其他库到JRE。下一个障碍是RHEL5共享库加载器不会加载这些库。您必须使用兼容的加载程序。但是JVM具有可执行文件中硬编码的加载器的路径!所以你需要一个单独的JVM,并修补了一个自定义加载器路径。粗略地说,实现这个工作的步骤是......

  1. 从RHEL 6

    中解压缩以下软件包
    • glib2
    • libffi
    • 的glibc
    • 的glibc-共同
    • 的zlib
    • gtk2的
    • 的pango
    • 开罗
    • pixman
  2. 将这些包中的所有共享库放在RHEL5系统的目录中。我们称之为/YOUR-ALIEN-RHEL6-LIBS-PATH

  3. 将JRE的另一个副本打包到/YOUR-ALIEN-JVM-PATH

  4. 使用patchelf将JVM可执行文件指向新加载程序。

    • ./usr/bin/patchelf --set-interpreter /YOUR-ALIEN-RHEL6-LIBS-PATH/lib/amd64/ld-linux-x86-64.so.2 /YOUR-ALIEN-JVM-PATH/jre1.8.0_25/bin/java
  5. 设置LD_LIBRARY_PATH=/YOUR-ALIEN-RHEL6-LIBS-PATH/lib/amd64:/YOUR-ALIEN-RHEL6-LIBS-PATH/lib/amd64/jli

  6. 后运行应用程序

    虽然它不漂亮,但我已经使用这种方法在RHEL5上成功运行了JavaFX应用程序。话虽如此,我强烈建议您升级操作系统,如果它甚至可行的话。

答案 1 :(得分:1)

请注意,这建立在詹姆斯现有答案的基础上,具体细节

从RedHat 6.x获得RPM,例如http://vault.centos.org/6.2/os/i386/Packages。复制到目录rpms/

cairo-1.8.8-3.1.el6.i686.rpm
glib2-2.22.5-6.el6.i686.rpm
glibc-2.12-1.47.el6.i686.rpm
glibc-common-2.12-1.47.el6.i686.rpm
gtk2-2.18.9-6.el6.centos.i686.rpm
libffi-3.0.5-3.2.el6.i686.rpm
libXcomposite-0.4.1-2.el6.i686.rpm <== not mentioned in other answer
pango-1.28.1-3.el6_0.centos.5.i686.rpm
pixman-0.18.4-1.el6_0.1.i686.rpm
zlib-1.2.3-27.el6.i686.rpm
libXdamage-1.1.2-1.el6.i686.rpm   <== not mentioned in other answer

将RPM中的所有内容解压缩到单独的目录中。使用rpm2cpioxzcat。如有必要,xzcat

可以从这些RPM安装[xz, xz-libs, xz-lzma-compat]
mkdir redhat-6u2-libs
cd redhat-6u2-libs/
ls -1 rpms/* | xargs -i{} bash -c "rpm2cpio {} | xzcat | cpio -idmv"

获取patchelf的副本。我是从源码构建的,因为无法找到Redhat 5 RPM。只需要相关的RPM [gcc, gcc-c++, glibc-devel, kernel-headers, libstdc++-devel]

wget https://nixos.org/releases/patchelf/patchelf-0.9/patchelf-0.9.tar.bz2
tar xjf patchelf-0.9.tar.bz2
cd patchelf-0.9
./configure --prefix /tmp/patchelf
make install

使用patchelf设置redhat 6u2加载程序(也称为解释程序)的位置

/tmp/patchelf/bin/patchelf --set-interpreter ~/redhat-6u2-libs/lib/ld-linux.so.2 jdk1.8.0_40/bin/java

设置LD_LIBRARY_PATH,这需要同时包含/usr/lib/lib,否则会出现段错误。

export LD_LIBRARY_PATH=/home/user/redhat-6u2-libs/usr/lib:/home/user/redhat-6u2-libs/lib

(请注意,设置LD_LIBRARY_PATH之后运行的任何其他应用程序除了已经更正其解释程序位置的java之外的其他应用程序将会出现段错误。)

现在运行java app ...

./jdk1.8.0_40/bin/java -cp  etc...

快乐的日子