Ubuntu 似乎更倾向于使用 OpenJDK/JRE,而不是 Sun JDK/JRE。即使在我安装了 Sun JRE、JDK 和插件并花了一些时间挑选出与 OpenJDK 相关的软件包之后,apt-get 还是将它们重新安装,并将一些软件包作为依赖项。是否可以纠正此行为以支持 Sun Java 软件包?我想安装一个且只有一个 Java 堆栈(是的,这有点强迫症,但我希望我的系统干净)并且希望它是 Sun Java。
更新:正如 Marcos Roriz 所指出的,问题似乎出在指向 OpenJDK 的 default-jre(依赖于 Java 的软件包所依赖的),因此问题似乎是关于如何破解 default-jre/default-jdk 以指向 Sun Java。
答案1
在旧版本的 Ubuntu(9.10 及以下版本)上安装 Sun Java
我记得大约三年前使用 Ubuntu 8.04 时也遇到过同样的问题。使用 openjre 时出现了一个奇怪的问题,使用 sun jre 版本解决了这个问题。以下是适用于 10.04 以下版本的终端步骤,因为从 10.04 开始 sun java 已被删除并由 openjre 取代:
sudo apt-get remove openjdk-6-jre default-jre default-jre-headless
sudo apt-get install sun-java6-jre sun-java6-bin sun-java6-plugin sun-java6-fonts
(与 Sun Java 相关的一切。只是为了确保)
之后,如果您删除了 openjdk,那么您将只剩下 sun java。如果您没有删除它,那么您将同时拥有它们两个。要从一个更改为另一个,请执行以下操作:
sudo update-java-alternatives -l
- 这将显示您可以使用的 Java 引擎列表。
java 替代方案的名称是左侧的名称,例如 openjdk 将显示如下:
java-6-openjdk 1061 /usr/lib/jvm/java-6-openjdk
你可以像这样将系统设置为 openjdk:
sudo update-java-alternatives -s java-6-openjdk
如果您想使用 Sun,那么您可以这样做(安装 sun 软件包之后):
sudo update-java-alternatives -s java-6-sun
如果您想使用 Java 7 版本,只需将上面提到的数字 6 更改为 7。例如,如果我想安装 OpenJre 版本 7,我会:
sudo apt-get install openjdk-7-jre default-jre default-jre-headless
在较新版本的 Ubuntu(10.04 及以上版本)上安装 Sun Java
打开终端并输入以下内容:
sudo add-apt-repository ppa:webupd8team/java
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install oracle-java7-installer
这样应该会在您的系统上安装 Sun Java 版本。如果您有其他 Java 替代方案,只需执行以下操作即可进行更改:
sudo update-java-alternatives -s java-7-oracle
如果您希望自动安装,请输入以下内容:
sudo echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections
之后只需执行以下操作即可设置默认环境变量:
sudo apt-get install oracle-java7-set-default
请注意,PPA 包含版本 6、7 和 8。因此,您只需更改安装行中的数字即可安装其中任何一个,例如:
sudo apt-get install oracle-java8-installer
将安装 Java 8。安装您想要使用的 Java 版本并使用命令将版本设置为默认值后update-java-alternatives
,您可以通过输入以下命令来检查您正在使用的版本:
java -version
它将显示您当前正在使用的默认版本。
我还想说一下,OpenJRE/JDK 与 2 或 3 年前相比已经有了长足的进步,当时它存在许多问题,通过改用 Sun Java 已经得到了解决。
答案2
我认为问题在于某些 Java 包依赖于指向 openjdk-jre 的 default-jre。我认为没有简单的方法可以永久卸载 openjdk。问题是,当您安装 java 包/程序时,您可能会再次遇到 openjdk。
但是如果您愿意同时拥有两者,那么将 java 运行时程序(java、javah、javap 等)设置为 sun 实现是否容易呢?请执行以下操作:
sudo apt-get install sun-java6-jre sun-java6-plugin sun-java6-fonts
或者如果你是 Java 开发人员(安装 sdk 和 srcs):
sudo apt-get install sun-java6-jdk sun-java6-jre sun-java6-source
并将其设置为默认程序:
sudo update-java-alternatives -s java-6-sun
答案3
该.jdk1.6.0_23.jinfo
文件应是所提供程序及其路径的列表。有一个描述性标题,后面跟着一个空白行。然后是三个字段格式的程序列表:条目类型 (jre/jkd/plugin);程序名称;和路径。您应该有一些 jinfo 文件,您可以使用它们来查看内容应该是什么样子。替代机制可能会使用它来确定要创建哪些链接。我的 Sun 软件包的头部是。
名称=java-6-sun-1.6.0.22 别名=java-6-sun 优先级=63 部分=非自由 jre 控制面板 /usr/lib/jvm/java-6-sun/jre/bin/ControlPanel jre java /usr/lib/jvm/java-6-sun/jre/bin/java jre java_vm /usr/lib/jvm/java-6-sun/jre/bin/java_vm
如果您想覆盖默认的 Java 命令而不使用替代机制,请将 Java 路径放在路径中的 /usr/bin 前面。
当进行手动安装时,我将 Java 安装到 中/opt
。对于您的安装,我将安装在 中/opt/jdk1.6.0_23
。然后,我将路径$JAVA_HOME/bin
放在变量的开头PATH
。
编辑:这是整个 Sun 文件。注意.java-6-sun.jinfo
是 的符号链接.java-6-sun-1.6.0.22.jinfo
。
名称=java-6-sun-1.6.0.22 别名=java-6-sun 优先级=63 部分=非自由 jre 控制面板 /usr/lib/jvm/java-6-sun/jre/bin/ControlPanel jre java /usr/lib/jvm/java-6-sun/jre/bin/java jre java_vm /usr/lib/jvm/java-6-sun/jre/bin/java_vm jre javaws /usr/lib/jvm/java-6-sun/jre/bin/javaws jre jcontrol /usr/lib/jvm/java-6-sun/jre/bin/jcontrol jre 密钥工具 /usr/lib/jvm/java-6-sun/jre/bin/keytool jre pack200 /usr/lib/jvm/java-6-sun/jre/bin/pack200 jre 策略工具 /usr/lib/jvm/java-6-sun/jre/bin/policytool jre rmid /usr/lib/jvm/java-6-sun/jre/bin/rmid jre rmiregistry /usr/lib/jvm/java-6-sun/jre/bin/rmiregistry jre 解包200 /usr/lib/jvm/java-6-sun/jre/bin/unpack200 jre orbd /usr/lib/jvm/java-6-sun/jre/bin/orbd jre 服务器工具 /usr/lib/jvm/java-6-sun/jre/bin/servertool jre tnameserv /usr/lib/jvm/java-6-sun/jre/bin/tnameserv jre jexec /usr/lib/jvm/java-6-sun/jre/lib/jexec jdk HtmlConverter /usr/lib/jvm/java-6-sun/bin/HtmlConverter jdk 小程序查看器 /usr/lib/jvm/java-6-sun/bin/appletviewer jdk apt /usr/lib/jvm/java-6-sun/bin/apt jdk extcheck /usr/lib/jvm/java-6-sun/bin/extcheck jdk idlj /usr/lib/jvm/java-6-sun/bin/idlj jdk jar /usr/lib/jvm/java-6-sun/bin/jar jdk jarsigner /usr/lib/jvm/java-6-sun/bin/jarsigner jdk javac /usr/lib/jvm/java-6-sun/bin/javac jdk javadoc /usr/lib/jvm/java-6-sun/bin/javadoc jdk javah /usr/lib/jvm/java-6-sun/bin/javah jdk javap /usr/lib/jvm/java-6-sun/bin/javap jdk jconsole /usr/lib/jvm/java-6-sun/bin/jconsole jdk jdb /usr/lib/jvm/java-6-sun/bin/jdb jdk jhat /usr/lib/jvm/java-6-sun/bin/jhat jdk jinfo /usr/lib/jvm/java-6-sun/bin/jinfo jdk jmap /usr/lib/jvm/java-6-sun/bin/jmap jdk jps /usr/lib/jvm/java-6-sun/bin/jps jdk jrunscript /usr/lib/jvm/java-6-sun/bin/jrunscript jdk jsadebugd /usr/lib/jvm/java-6-sun/bin/jsadebugd jdk jstack /usr/lib/jvm/java-6-sun/bin/jstack jdk jstat /usr/lib/jvm/java-6-sun/bin/jstat jdk jstatd /usr/lib/jvm/java-6-sun/bin/jstatd jdk native2ascii /usr/lib/jvm/java-6-sun/bin/native2ascii jdk rmic /usr/lib/jvm/java-6-sun/bin/rmic jdk schemagen /usr/lib/jvm/java-6-sun/bin/schemagen jdk 串行器 /usr/lib/jvm/java-6-sun/bin/serialver jdk wsgen /usr/lib/jvm/java-6-sun/bin/wsgen jdk wsimport /usr/lib/jvm/java-6-sun/bin/wsimport jdk xjc /usr/lib/jvm/java-6-sun/bin/xjc 插件 xulrunner-1.9-javaplugin.so /usr/lib/jvm/java-6-sun/jre/lib/amd64/libnpjp2.so 插件 mozilla-javaplugin.so /usr/lib/jvm/java-6-sun/jre/lib/amd64/libnpjp2.so
答案4
我在 /etc/environment 文件中添加了此行:JAVA_HOME="/usr/lib/jvm/jdk1.6.0_23",并将 JAVA_HOME/bin 添加到 PATH 变量,但操作系统仍然无法识别命令 java,说它未安装并提供 gcj 和 openjdk。
你檢查了嗎?
echo $JAVA_HOME
echo $PATH
如果您不需要它:在 synaptic 中或使用 apt-get 卸载 openjdk 和 gcj。
apt-get remove gcj
apt-get remove openjdk
那么我将禁止使用 Java 作为替代方案,并且主要按照 BillThor 的建议去做,这就是我给他投赞成票的原因。
which javac
which java
应该指向您安装 java 的位置,以及它在 PATH 中的位置。