2011年10月24日 星期一

JDK7 on non-RPM based Linux

JDK 7出來已經有一段時日了,官方網頁也貼心的提供了rpm的套件可以直接安裝,只可惜沒有deb可以下載。雖然如此,我們還是可以省略掉一些手法來同時使用系統提供的jdk6以及網路下載的jdk7--利用update-alternatives工具來達成。但是為了方便作說明,還是先安裝系統套件庫所提供的jdk6吧:

aptitude install sun-java6-jdk

下載適合自己的版本 x86或是x86_64之後,查看自己的java版本以及安裝在何處:

ls -l `which java`
發現原來是連結到/etc/alternatives裡:
lrwxrwxrwx 1 root root 22 2011-10-24 21:39 /usr/bin/java -> /etc/alternatives/java
利用update-alternatives來幫助我們作版本控制,使我們不用手動設定變數等複雜設定,也統一了管理介面。
ls -l /etc/alternatives/java
lrwxrwxrwx 1 root root 36 2011-10-24 21:39 /etc/alternatives/java -> /usr/lib/jvm/java-6-sun/jre/bin/java
所以結果揭曉:/usr/bin/java是來自於/etc/alternatives的一個軟連結,而這個軟連結源自於真正的java位置。所以我們看看他的狀態:
update-alternatives --display java
輸出結果可能會是:
java - auto mode
  link currently points to /usr/lib/jvm/java-6-sun/jre/bin/java
/usr/lib/jvm/java-6-sun/jre/bin/java - priority 63
  slave java.1.gz: /usr/lib/jvm/java-6-sun/jre/man/man1/java.1.gz
Current 'best' version is '/usr/lib/jvm/java-6-sun/jre/bin/java'.

所以我們也可以如法泡製,把下載來的jdk7放在/usr/lib/jvm底下。 請至oracle網站下載最新版本的jdk,假設是jdk-7u25-linux-x64.tar.gz

sudo tar zxvf jdk-7u25-linux-x64.tar.gz -C /usr/lib/jvm/
但此時update-alternatives的cache裡並不會自己發現有jdk的存在,這是安裝一個deb檔的postinst程序才會執行的部份。我們自己試著新增一個,語法如下:
update-alternatives --install <link> <name> <path> <priority>

通常priority大於1000比較有可能是首選。假設您下載了多個jdk7的版本且想要安裝到最新,可以利用下列script來達成:

所以到此為止雖然我們都沒有透過dpkg或是aptitude來安裝jdk7,但是一樣可以作到版本控制,非常方便。

啟動Java plugins:
你可以點我有Java嗎?來測試Java plugin是否有安裝上去。在我的LinuxMint 11 amd64的版本裡,我即使安裝了sun-java6-plugin,無論是我的firefox 或是chrome都無法顯示成功啟動java plugin。
試試看這樣行不行得通:

cd /usr/lib/mozilla/plugins
ln -s /usr/lib/jvm/jdk1.7.0_25/jre/lib/amd64/libnpjp2.so .
如果是rpm-based linux,可以這麼做:
cd /usr/lib/mozilla/plugins
ln -s /usr/java/default/jre/lib/amd64/libnpjp2.so .

參考文章:
man update-alternatives

Share