2014-06-26 57 views
3

從我的previous question中,我知道RedHat 5.8不支持JavaFX,即使在我的Linux上安裝了Java 8(jdk1.8.0_05)時,在win7中創建的JAR文件也可以'通過java -jar helloworld.jar執行。這是否意味着沒有辦法在這臺機器上運行JavaFX jars?在Redhat 5上運行JavaFX應用程序

+0

你唯一的改變就是在這臺機器上安裝OpenJDK:'yum install java-1.8.0 -openjdk-devel'.then,if y你不能,你將不得不升級系統。 – Mansueli

回答

2

在RHEL5上運行JavaFX應用程序的問題是該操作系統附帶的glib版本不夠新。訣竅是提供該庫的更新版本以及依賴於JRE的所有其他庫。下一個障礙是RHEL5共享庫加載器不會加載這些庫。你必須使用兼容的加載器。但是JVM具有在可執行文件中硬編碼的加載器的路徑!因此,你需要在修補一個自定義的加載路徑不同的JVM粗略地說,步驟獲得這個工作是...

  1. 拆開從RHEL以下軟件包:

    • glib2
    • libffi
    • 的glibc
    • glibc的共用
    • ZLIB
    • GTK2
    • 攀高
    • 開羅
    • 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

雖然不漂亮後的應用程序,我已經成功地運行使用此方法在RHEL5 JavaFX應用程序。話雖如此,我強烈建議只要升級您的操作系統,如果它是遠程可行的。

+0

非常感謝你的回答,你是一個天才。這個技巧沒有記錄在其他地方我能找到。希望你不介意,但也回答更具體的可重複的細節。我也需要libXcomposite,可能是因爲使用棱鏡軟件渲染。 – Adam

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中的所有內容解壓到單獨的目錄中。使用rpm2cpioxzcatxzcat可以從這些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應用程序...

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

Happy days