我可以同时安装32位和64位版本的Java吗?

为了正常开发,我使用的是64位虚拟机,这是在安装Java开发工具包(OpenJDK)时自带的。但是有一些Java应用程序(包含本地库,我猜测)无法在64位Java虚拟机上运行。(看起来SoapUI就是这样一个候选者-在4.0.1版本和4.5 beta 1版本中,如果在64位虚拟机上运行,它会出现分段错误。)
我尝试安装openjdk-6-jre的i386版本,以补充64位版本,但aptitude拒绝了(说它与现有的64位版本冲突)。如果我尝试安装32位版本的openjdk-jre-7,也会出现同样的情况。
对于Can I run a Java 32-bit application on a 64bit system的回答建议安装ia32-sun-java6-bin,但没有这个名称的软件包(或者任何包含ia32和Java的内容)。
有什么办法可以在这里运行SoapUI而不必将整个系统的Java安装切换到32位?

我实际上成功地通过编辑shell脚本来传递一些不同的参数,以使用64位版本运行soapUI。我得查一下我到底做了什么。 - Paŭlo Ebermann
请参考http://askubuntu.com/questions/111947/running-32-bit-firefox-with-sun-jre-in-64-bit-ubuntu/203006#203006,了解如何从软件源安装64位和32位的Java。您还可以更改默认设置。 - user68186
3个回答

安装多个版本的Java非常简单。但是在不同版本之间随意切换则有点困难(读作:繁琐)。

tldr

  1. 使用apt-get安装一个版本
  2. 解压缩另一个版本
  3. 根据需要导出路径

使用apt-get安装一个版本

决定你将主要使用哪个版本。或者决定哪个版本希望自动更新。或者抛硬币,随便选一个。你甚至可以不使用apt-get,只需手动在系统上维护这两个软件包(参见下一标题)。

关键是:使用Ubuntu的软件包管理器来维护一个确切的Java软件包版本更容易。其余的事情由你自己处理。

解压缩另一个版本

下载一个JDK压缩包。将其解压缩到/opt目录下。

在版本之间切换

我让软件包管理器处理我的主要安装。当我需要另一个版本时,我会导出一些变量。因为我经常在命令行上工作,所以对我来说这是一个可行的解决方案。我会关注以下事项:

export JAVA_HOME=/opt/jdk
export PATH=$JAVA_HOME/bin:$PATH

此外,我还创建了一个符号链接 jdk/ -> jdk1.6.0_3/,因为我懒得重新配置我的 .bashrc 和其他脚本,每次 JDK 升级都要重新配置很麻烦。
以下是你可能关心的环境变量:
JAVA_LIBDIR
JNI_LIBDIR
JAVAJNI_LIBDIR
JVM_ROOT
JAVA_HOME
PATH

你难道不能直接获取另一种架构的.deb文件,而不是使用tarball吗? - 0xC0000022L
@0xC0000022L 的想法是将每个版本都放在自己的目录中。如果你能用 deb 包实现这一点,那太好了! - djeikyb

安装

首先,从Sun官网下载最新的32位JDK(不是JRE)。在我这个时候,是jdk-6u7-linux-i586.bin。

安装java-package:

sudo apt-get install java-package 

现在使用java-package从您下载的二进制文件构建.deb软件包。您必须欺骗它以构建32位软件包:

DEB_BUILD_GNU_TYPE=i486-linux-gnu DEB_BUILD_ARCH=i386 fakeroot make-jpkg jdk-6u7-linux-i586.bin 

这应该生成一个 .deb 包。由于某种原因,包名带有 _amd64 后缀。安装该包:
sudo dpkg -i sun-j2sdk1.6_1.6.0+update7_amd64.deb 

使用update-alternatives命令来选择新的JDK。对于我来说,它被安装在/usr/lib/j2sdk1.6-sun目录下。
sudo update-alternatives --config java 

如果你运行java -version命令,你应该看到正确的版本。
java version "1.6.0_07"
Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
Java HotSpot(TM) Server VM (build 10.0-b23, mixed mode)

32位的Eclipse 我不得不重新安装32位版本的Eclipse(因为SWT包含本地代码)。我还必须删除我的~/.eclipse目录,否则Eclipse无法启动(这需要重新安装任何插件的新版本)。最后,在Java->已安装的JRE中使用安装位置(/usr/lib/j2sdk1.6-sun)添加新的JRE,并将其选为默认值。 ref

谢谢,我会试一试……虽然我不想让32位的成为默认选项,只是用来运行那些不支持64位的少数程序。 - Paŭlo Ebermann


2在Ubuntu 11.10及以后的版本中,安装ia32-libs不是推荐的方法。您可以参考这个链接了解更多信息:http://askubuntu.com/questions/107230/what-happened-to-the-ia32-libs-package - m-ric