当前位置:

首页 > 编程开发 > Ubuntu安装OracleJDK及环境配置教程

Ubuntu安装OracleJDK及环境配置教程

首先下载OracleJDK的.tar.gz文件并解压至/usr/lib/jvm,再通过update-alternatives注册Java命令,设置默认JDK版本,并在~/.bashrc中配置JAVA_HOME和PATH环境变量,最后验证java-version和JAVA_HOME确保安装正确。该方法适用于需要兼容特定商业软件或统一开发环境的场景。

首先下载Oracle JDK的.tar.gz文件并解压至/usr/lib/jvm,再通过update-alternatives注册Java命令,设置默认JDK版本,并在~/.bashrc中配置JAVA_HOME和PATH环境变量,最后验证java -version和JAVA_HOME确保安装正确。该方法适用于需要兼容特定商业软件或统一开发环境的场景。

如何在Ubuntu中安装OracleJDK并设置环境

在Ubuntu中安装Oracle JDK,核心在于从Oracle官网下载其.tar.gz压缩包,手动解压到系统路径,然后通过配置环境变量JAVA_HOME和修改PATH,或者更推荐地使用update-alternatives工具,将新安装的JDK注册并设置为系统默认的Java环境。

解决方案

要在Ubuntu系统上安装Oracle JDK并妥善配置环境,通常我会遵循以下步骤。虽然OpenJDK是Ubuntu的默认选择,但在某些特定场景,比如需要与某些商业软件兼容,或者仅仅是个人偏好,Oracle JDK依然是不可或缺的。

  1. 下载Oracle JDK压缩包: 访问Oracle官方网站的Java SE下载页面。你需要找到适合Linux x64架构的.tar.gz文件。注意,Oracle JDK的下载通常需要接受许可协议。选择一个长期支持(LTS)版本,比如JDK 17或JDK 11,它们在稳定性和社区支持上都有很好的表现。下载完成后,这个文件通常会保存在你的~/Downloads目录下。

  2. 创建安装目录: 为了保持系统整洁和规范,我习惯将JDK安装到/usr/lib/jvm目录下。如果这个目录不存在,你需要先创建它。

    sudo mkdir -p /usr/lib/jvm
  3. 解压JDK到目标目录: 将你下载的.tar.gz文件解压到刚刚创建的/usr/lib/jvm目录。请将jdk-xx_linux-x64.tar.gz替换为你实际下载的文件名,并将jdk-17.0.x替换为解压后生成的目录名(例如,jdk-17.0.10)。

    cd ~/Downloads
    sudo tar -xvf jdk-xx_linux-x64.tar.gz -C /usr/lib/jvm/
    # 解压后,你可能会得到一个类似 jdk-17.0.x 的目录。为了方便管理,可以给它一个更清晰的软链接或重命名。
    # 例如,如果解压后是 /usr/lib/jvm/jdk-17.0.10,可以创建一个软链接:
    # sudo ln -s /usr/lib/jvm/jdk-17.0.10 /usr/lib/jvm/oracle-jdk-17
    # 之后所有的配置都指向 /usr/lib/jvm/oracle-jdk-17

    我个人更倾向于直接重命名解压后的目录,比如sudo mv /usr/lib/jvm/jdk-17.0.10 /usr/lib/jvm/oracle-jdk-17,这样路径更直观。

  4. 配置系统环境变量(推荐使用update-alternatives): Ubuntu提供了一个非常方便的update-alternatives工具来管理系统中不同版本的程序。这是我最推荐的方式,因为它能让你轻松地在多个JDK版本之间切换。

    注册Oracle JDK到update-alternatives系统:

    sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/oracle-jdk-17/bin/java" 1
    sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/oracle-jdk-17/bin/javac" 1
    sudo update-alternatives --install "/usr/bin/jar" "jar" "/usr/lib/jvm/oracle-jdk-17/bin/jar" 1
    sudo update-alternatives --install "/usr/bin/javadoc" "javadoc" "/usr/lib/jvm/oracle-jdk-17/bin/javadoc" 1
    # 可以根据需要注册更多Java工具,比如 jjs, keytool 等

    这里的1是优先级,数字越大优先级越高。如果你安装了多个JDK,可以通过调整优先级来控制默认使用哪个。

    选择Oracle JDK作为默认的Java版本:

    sudo update-alternatives --config java
    sudo update-alternatives --config javac

    运行这些命令后,系统会列出所有已注册的Java和Javac版本,并提示你输入数字来选择默认使用的版本。

  5. 设置JAVA_HOME环境变量: 虽然update-alternatives已经处理了javajavac命令的路径,但许多Java应用程序和构建工具(如Maven、Gradle)仍然依赖于JAVA_HOME环境变量来定位JDK的安装路径。

    打开你的用户配置文件(通常是~/.bashrc~/.profile,如果你使用Zsh可能是~/.zshrc):

    nano ~/.bashrc

    在文件末尾添加以下两行:

    export JAVA_HOME="/usr/lib/jvm/oracle-jdk-17"
    export PATH="$PATH:$JAVA_HOME/bin"

    保存并关闭文件。

    让配置立即生效:

    source ~/.bashrc

    如果你修改的是~/.profile,可能需要注销并重新登录才能生效。

  6. 验证安装: 打开一个新的终端窗口(或重新加载配置后),运行以下命令来确认Oracle JDK已正确安装并设置为默认:

    java -version
    javac -version
    echo $JAVA_HOME

    你应该能看到Oracle JDK的版本信息,并且JAVA_HOME指向你设置的路径。

为什么我应该选择Oracle JDK而不是Ubuntu默认的OpenJDK?

这是一个非常实际的问题,尤其是在我个人开发经历中,经常会遇到。Ubuntu默认安装的OpenJDK,在大多数情况下都表现得非常出色,而且它是完全开源、免费的。但选择Oracle JDK,往往是出于一些特定的考量:

首先,兼容性需求。我遇到过一些老旧的、或者由特定厂商开发的商业Java应用,它们在设计和测试时可能就是基于Oracle JDK进行的。虽然理论上Java是“一次编写,到处运行”,但实际操作中,不同JDK实现之间在某些边缘特性、JVM参数甚至垃圾回收器行为上可能存在细微差异。为了避免那些难以追踪的“玄学”兼容性问题,或者第三方服务明确要求使用Oracle JDK时,我通常会选择它。

其次,特定功能或工具。虽然Oracle已经将很多核心功能(比如JFR/JMC)开源给了OpenJDK,但在一些非常专业的企业级场景下,Oracle JDK可能仍提供一些独特的商业特性、性能优化或者支持服务,这些对于某些高度敏感或性能关键的应用来说,可能是决定性的因素。虽然现在这些差异越来越小,但在一些遗留系统或特定领域,Oracle JDK的优势依然存在。

最后,个人习惯或团队规范。我认识不少开发者,他们从Java的早期阶段就一直使用Oracle JDK,对其工具链和行为模式非常熟悉。当团队内部有统一的JDK版本和发行商要求时,为了保持开发环境的一致性,使用Oracle JDK也是一个合理的选择。这无关乎好坏,更多是基于实际工作流和历史沉淀的考量。

总而言之,如果你只是进行日常开发、学习或者运行一般的开源应用,OpenJDK通常是足够且更简单的选择。但如果你的项目有明确的兼容性要求、需要特定的企业级支持或功能,或者只是想保持与生产环境的高度一致性,那么Oracle JDK就有了它的用武之地。

如何管理多个JDK版本并在它们之间切换?

在我的日常开发中,同时维护多个Java项目是常态,而这些项目可能依赖不同的JDK版本,比如一个老项目跑在JDK 8上,新项目则需要JDK 17。这时候,高效地管理和切换JDK版本就显得尤为重要。

最优雅的解决方案,我认为非update-alternatives莫属。前面安装Oracle JDK时已经用到了它,这里我们来深入理解一下它的工作原理和使用方式。update-alternatives通过在/etc/alternatives目录下创建符号链接,并最终指向实际的二进制文件,来管理系统中同名程序的多个版本。

添加更多JDK版本: 如果你想安装另一个版本的JDK(比如OpenJDK 8),你可以像安装Oracle JDK一样,下载、解压到/usr/lib/jvm/目录下,然后用update-alternatives注册它。

# 假设你安装了 OpenJDK 8 到 /usr/lib/jvm/openjdk-8
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/lib/jvm/openjdk-8/bin/java" 2
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/lib/jvm/openjdk-8/bin/javac" 2
# 注意这里的优先级数字,如果想让它成为默认,就设置一个比现有更高的数字。
# 如果只是备用,保持较低的优先级即可。

在不同JDK版本间切换: 这是update-alternatives最实用的功能。只需运行:

sudo update-alternatives --config java
sudo update-alternatives --config javac

系统会列出所有已注册的java(或javac)版本,每个版本前都有一个编号。你只需输入对应的编号,然后回车,即可将系统默认的Java版本切换到你选择的那一个。这个操作会立即生效,无需重启终端或系统。

针对特定项目设置JAVA_HOME 虽然update-alternatives管理了全局的javajavac命令,但许多构建工具(如Maven、Gradle)或IDE(如IntelliJ IDEA、Eclipse)会优先读取JAVA_HOME环境变量来确定使用哪个JDK。

  • 临时切换JAVA_HOME 如果你只是想在当前终端会话中为某个项目使用特定JDK,可以临时设置JAVA_HOME

    export JAVA_HOME="/usr/lib/jvm/openjdk-8" # 或者 /usr/lib/jvm/oracle-jdk-17
    export PATH="$JAVA_HOME/bin:$PATH" # 确保新路径在前
    java -version # 验证

    这个设置只在当前终端会话有效,关闭终端后就会失效。

  • 通过IDE或构建工具设置: 更常见且推荐的做法是,在你的IDE(如IntelliJ IDEA的Project Structure或Eclipse的Installed JREs)中直接配置项目所需的JDK路径。Maven或Gradle项目也可以在其配置文件中指定JDK路径,这样可以确保项目在不同开发者的机器上都能使用正确的JDK版本,而不会受到全局JAVA_HOME的影响。这种方式的好处是,你可以让全局系统默认使用一个JDK,而特定项目则使用另一个,互不干扰。

安装后遇到问题如何排查和解决?

即使安装过程看起来很顺利,也难免会遇到一些小插曲。我个人在配置JDK环境时,最常遇到的就是java -versionjavac -version显示不一致,或者应用启动报错。以下是一些常见的排查和解决思路:

  1. java -version显示错误版本或命令未找到:

    • 检查PATH环境变量: 这是最常见的问题。运行echo $PATH,看看你的JAVA_HOME/bin路径是否正确地包含在其中,并且它的优先级是否足够高(通常放在前面)。如果update-alternatives配置的/usr/bin路径没有生效,也需要检查PATH
    • 重新加载shell配置: 如果你修改了~/.bashrc~/.profile,确保你已经运行了source ~/.bashrc(或source ~/.profile),或者干脆打开一个新的终端窗口,因为环境变量只在新的shell会话中生效。
    • 检查update-alternatives配置: 运行sudo update-alternatives --config javasudo update-alternatives --config javac,确认你已经选择了正确的Oracle JDK版本作为默认。有时候,手动设置JAVA_HOME可能会与update-alternatives的全局设置产生冲突,导致混乱。
    • 文件权限问题: 检查/usr/lib/jvm/oracle-jdk-17及其内部文件的权限,确保所有用户(至少是当前用户)有读取和执行的权限。ls -l /usr/lib/jvm/oracle-jdk-17/bin/java可以帮助你检查。
  2. javac命令未找到或版本不匹配:

    • 这通常与java命令的问题类似,排查思路也基本相同。javac是JDK的一部分,如果java能正常工作,javac通常也能。重点检查PATHupdate-alternatives --config javac
  3. 应用程序运行时出现UnsupportedClassVersionError

    • 这个错误意味着你的Java应用程序是用一个更高版本的JDK编译的,而你当前运行它的JDK版本太低。例如,用JDK 17编译的代码,尝试在JDK 8上运行就会报错。
    • 解决方案: 确保你运行应用程序的Java环境(无论是通过java -jar直接运行,还是通过Maven/Gradle构建)与编译该应用程序的JDK版本相同或更高。你可以通过java -version来确认当前运行环境的JDK版本。
  4. 下载的JDK压缩包损坏:

    • 如果你在解压时遇到错误,或者解压后的文件不完整,很可能是下载过程中文件损坏了。重新从Oracle官网下载一次,并确保网络连接稳定。
  5. JAVA_HOME设置错误:

    • 运行echo $JAVA_HOME,确认它指向的是JDK的根目录,而不是bin目录。例如,应该是/usr/lib/jvm/oracle-jdk-17,而不是/usr/lib/jvm/oracle-jdk-17/bin。许多Java工具和脚本都依赖这个变量来查找JDK的完整安装路径。

排查这些问题时,我通常会一步步来,从最表层的java -version开始,然后检查PATH,再到JAVA_HOME,最后才是更深层次的权限或文件完整性问题。耐心和细致是解决这些配置问题的关键。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
C++动态数组初始化怎么写?常用语句与代码示例
C++动态数组初始化怎么写?常用语句与代码示例

深入解析C++中动态数组的初始化机制,涵盖new操作符的不同用法、基本类型与类对象的初始化差异,以及为何在现代C++开发中应优先使用std::vector。

using namespace 使用中遇到的问题怎么解决
using namespace 使用中遇到的问题怎么解决

命名空间的基本概念与常见引入问题在C++等编程语言中,命名空间(namespace)是一种将代码标识符(如变量、函数、类名)封装在特定名称下的机制,其主要目的是避免命名冲突,尤其是在大型项目或使用多个第三方库时。使用“using namespace”指令可以将指定命名空间中的所有名称引入当前作用域,

c语言函数递归 实操经验总结:这些技巧很实用
c语言函数递归 实操经验总结:这些技巧很实用

理解递归的基本原理在C语言中,递归是一种函数调用自身的编程技术。要掌握它,首先需要理解其核心思想:将一个复杂的大问题,分解为一个或几个与原问题相似但规模更小的子问题,直到子问题足够简单,可以直接求解。这个过程通常包含两个关键部分:递归出口和递归体。递归出口定义了问题何时不再继续分解,即最简单、可直接

c语言函数递归 怎么选?常见方案对比分析
c语言函数递归 怎么选?常见方案对比分析

递归函数的基本概念与适用场景在C语言编程中,递归是一种函数调用自身的编程技巧。它并非适用于所有问题,但在处理某些具有自相似结构的问题时,能提供极其清晰和优雅的解决方案。递归的核心思想是将一个大规模问题分解为一个或多个同类型但规模更小的子问题,直到子问题简单到可以直接求解。典型的适用场景包括树形结构的

Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解
Objective-C 内存管理入门:从 alloc 到 dealloc 的生命周期详解

理解内存管理的基石在Objective-C的编程世界中,内存管理是开发者必须掌握的核心技能之一。它直接关系到应用的性能、稳定性与资源利用效率。与一些采用自动垃圾回收机制的语言不同,Objective-C在很长一段时间里,依赖一套基于引用计数的、需要开发者部分介入的管理规则。这套规则的核心思想是明确的

如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏
如何正确使用 dealloc 以避免 iOS 应用中的内存泄漏

理解 dealloc 的角色与时机在 iOS 应用开发中,内存管理是保障应用性能与稳定性的基石。dealloc 方法是 Objective-C 中对象生命周期结束时的关键回调,它标志着对象即将被系统回收内存。正确理解其触发时机至关重要:当一个对象的引用计数降为零时,运行时系统会自动调用该对象的 de

深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制
深入理解 Objective-C 中的 dealloc 方法:内存管理核心机制

内存管理的基石在Objective-C的世界里,内存管理是开发者必须掌握的核心技能之一。作为一门在手动引用计数(MRC)时代诞生的语言,Objective-C要求程序员对对象的生命周期有清晰的认识。dealloc方法正是这一生命周期中至关重要的终点站。它是一个实例方法,当对象的引用计数降为零时,系统

理解 native2ascii:Java 国际化开发中的字符编码工具
理解 native2ascii:Java 国际化开发中的字符编码工具

native2ascii 工具的基本定位在Ja va应用程序的国际化与本地化开发过程中,处理非拉丁字符集是一个常见且关键的环节。Ja va内部使用Unicode字符集来统一表示全球各种语言的文字,但其属性文件(.properties)在历史上要求使用ASCII编码,或者更准确地说,要求非ASCII字

如何使用 native2ascii 转换中文字符为 Unicode 转义序列
如何使用 native2ascii 转换中文字符为 Unicode 转义序列

理解 native2ascii 工具的基本用途在软件开发,特别是涉及国际化处理的场景中,开发者常常需要处理不同编码的文本资源。native2ascii 是 Ja va 开发工具包(JDK)中提供的一个命令行实用程序,其主要功能是将包含本地字符编码(非ASCII字符)的文件,转换为包含 Unicode

Java native2ascii 命令详解:解决属性文件乱码问题
Java native2ascii 命令详解:解决属性文件乱码问题

native2ascii 命令的由来与作用在Ja va开发中,处理国际化资源文件是一个常见需求。资源文件通常以.properties格式存储,用于支持多语言界面。然而,Ja va属性文件默认采用ISO-8859-1字符集编码,这导致了一个直接的问题:当文件中包含非拉丁字符(如中文、日文、韩文等)时,

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。