十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Mac通过Homebrew安装JDK8:Temurin方案与多版本管理实战

Mac通过Homebrew安装JDK8:Temurin方案与多版本管理实战 1. 项目概述为什么在Mac上通过Brew安装JDK8依然是个技术活如果你是一名在Mac上开发的Java工程师或者需要运行一些基于Java 8的老项目那么安装JDK8几乎是绕不开的第一步。虽然现在Java的版本已经迭代到了21甚至更高但JDK8因其无与伦比的稳定性和庞大的存量生态依然是生产环境中的“中流砥柱”。很多企业级框架比如Spring Boot 2.x的某些版本以及大量的历史遗留系统都明确依赖Java 8的运行环境。在Mac上安装软件Homebrew简称Brew无疑是首选它被称为“macOS缺失的包管理器”一条命令就能解决依赖和安装干净利落。所以当需求变成“Mac使用brew安装jdk8”时很多人的第一反应是这还不简单brew install openjdk8不就完事了吗但实际操作过你就会发现这条路从2021年底开始就变得有点“坎坷”。直接运行上述命令你很可能会得到一个“Error: openjdk8 was discontinued”的提示。这是因为Homebrew官方出于维护成本的考虑已经从核心仓库homebrew-core中移除了对openjdk8formula的直接支持。这并不意味着Brew这条路走不通了而是需要我们换一种“姿势”来走。这就是我们今天要深入探讨的核心如何在当前2023年及以后的macOS系统上通过Homebrew生态成功安装并配置好JDK 8。这不仅仅是一条安装命令它涉及对Homebrew仓库机制的理解、对Apple芯片M1/M2/M3架构的适配、多版本JDK的管理以及最终确保你的IDE如IntelliJ IDEA、VS Code和命令行都能正确识别和使用它。整个过程更像是一次对macOS开发环境配置的微型实战。2. 核心思路与方案选型绕过“已停产”找到活水源头既然官方的homebrew-core仓库不再提供我们的核心思路就是寻找并利用第三方维护的“活水源头”。在Homebrew的体系中这主要指向两种方式Tap第三方仓库和Cask用于安装macOS原生应用格式的软件。2.1 方案对比Tap vs. Cask面对openjdk8的缺失我们通常有以下几种主流方案每种都有其适用场景和细微差别方案命令示例优点缺点/注意事项推荐场景1. 使用第三方Tapbrew tap homebrew/cask-versionsbrew install --cask temurin8目前最主流、最稳定的方案。Eclipse Temurin是Adoptium项目原AdoptOpenJDK提供的开源、免费、经过TCK认证的JDK发行版。需要先添加一个专门的“历史版本”cask仓库。安装的是.pkg或.dmg格式的应用会安装到/Applications目录并通过macOS的pkgutil注册。绝大多数用户的推荐选择。特别是使用Apple Silicon芯片的Mac它能提供原生ARM64版本性能更好。2. 安装Zulu发行版brew install --cask zulu8Azul Zulu也是知名的开源JDK发行版同样提供多架构支持。安装流程类似。同样是Cask需要确保homebrew/cask-versions仓库已添加。个人选择偏好问题。作为Temurin的替代选项两者皆可。3. 安装Oracle JDK 8从Oracle官网下载.dmg手动安装官方原版。需要Oracle账号登录许可证为OTN协议商业用途需注意。无法通过Brew直接管理。不推荐。除非有严格的Oracle JDK兼容性要求。4. 使用SDKMAN!curl -s “https://get.sdkman.io”bashbrsdk install java 8.0.392-tem专为管理多个SDK版本设计的工具非常灵活切换版本极快。需要额外安装一个工具对于只需要一个JDK8的用户来说略显复杂。注意网上有些非常古老的教程会提到brew install adoptopenjdk8这个Formula早已失效。AdoptOpenJDK项目已经迁移并演变为Eclipse Temurin由Adoptium社区维护。经过综合比较对于大多数只需要在Mac上安装一个稳定可用的JDK 8环境的开发者方案一通过homebrew/cask-versions安装Temurin8是当前的最佳实践。它不仅解决了安装问题还完美适配了Apple Silicon并且继承了Homebrew便于管理的优点。2.2 为什么选择Temurin和Cask这里解释一下背后的逻辑Tap的作用homebrew/cask-versions是一个由Homebrew官方团队维护的、专门存放软件旧版本Cask的仓库。因为主仓库homebrew/cask通常只保留软件的最新稳定版而像JDK 8这样的历史版本就被移到了这个“版本仓库”里。通过brew tap命令我们把这个仓库的“水龙头”打开里面的Formula安装配方就可以被我们使用了。Cask与Formula的区别普通的brew install安装的是“Formula”通常是编译好的二进制包或源码安装在/usr/local/CellarIntel或/opt/homebrew/CellarApple Silicon下。而brew install --cask安装的是“Cask”它专门用于安装macOS的应用程序.app、字体或插件.pkg,.dmg它们会被安装到系统标准位置如/Applications。Temurin的优势Eclipse Temurin是Java生态中公认的高质量、开源发行版。它提供了完整的ARM64原生支持在M系列芯片的Mac上运行效率远高于通过Rosetta 2转译的x86版本。通过Cask安装它会像其他Mac应用一样被系统妥善管理。所以我们的最终技术路线确定为Tap添加版本仓库 - Cask安装Temurin8 - 配置环境变量与IDE。3. 详细实操步骤从安装到验证接下来我们一步步完成整个流程。请打开你的“终端”Terminal。3.1 步骤一确保Homebrew本身是最新的在开始之前先更新Homebrew本身和所有已安装的Formula这是一个好习惯可以避免一些因仓库索引过期导致的找不到Formula的问题。brew update这个命令会拉取homebrew-core和homebrew-cask等核心仓库的最新索引。3.2 步骤二添加历史版本Cask仓库Tap如前所述我们需要“打开”那个存放旧版本软件的仓库水龙头。brew tap homebrew/cask-versions执行成功后终端通常不会有太多输出。你可以用brew tap命令查看当前已添加的所有Tap确认homebrew/cask-versions在列表中。3.3 步骤三安装Temurin 8现在我们可以安装JDK 8了。brew install --cask temurin8执行这个命令后请仔细阅读终端的输出对于Cask安装特别是JDK这种需要系统权限的安装包.pkg你可能会遇到以下情况直接开始下载并安装这是最顺利的情况。Homebrew会下载对应的.pkg安装程序并自动执行安装向导。过程中可能会弹出macOS的标准安装确认窗口要求你输入密码。输入密码并允许即可。提示“已损坏无法打开”或“身份不明的开发者”这是macOS Gatekeeper安全机制导致的。不要急着去系统设置里降低安全等级更安全的做法是使用xattr命令移除该文件的“隔离”属性如果Homebrew已经下载了pkg文件。但通常Homebrew在安装时会尝试自动处理。如果安装被中断可以尝试sudo xattr -dr com.apple.quarantine /path/to/the/downloaded.pkg路径需要替换为实际路径通常可以在Homebrew的报错信息或缓存目录$(brew --cache)下找到。 然后再次运行brew install --cask temurin8。安装失败提示找不到资源可能是网络问题或仓库临时同步问题。可以尝试再次brew update或者稍后再试。安装过程完成后终端会显示摘要信息。Temurin 8默认会被安装到/Library/Java/JavaVirtualMachines/temurin-8.jdk/目录下。这是一个系统级目录所有用户都可以访问。3.4 步骤四验证安装与配置环境变量安装完成后我们需要验证JDK是否真的可用并配置环境变量让系统知道它的位置。验证安装首先可以检查一下Java的安装路径。/usr/libexec/java_home -v 1.8这个命令是macOS特有的用于定位指定版本的JDK主目录。如果安装成功它会返回类似/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home的路径。配置环境变量以Zsh为例macOS Catalina及以后版本默认shell是Zsh。我们需要编辑~/.zshrc文件来设置JAVA_HOME和PATH。打开配置文件nano ~/.zshrc你也可以使用vim或code ~/.zshrc用VS Code打开。在文件末尾添加以下内容# 设置JDK 8为默认JDK export JAVA_8_HOME$(/usr/libexec/java_home -v 1.8) export JAVA_HOME$JAVA_8_HOME export PATH$JAVA_HOME/bin:$PATHJAVA_8_HOME动态获取JDK 8的安装主目录。JAVA_HOME设置当前默认的JDK主目录为JDK 8。PATH将JDK的bin目录包含java,javac等命令添加到系统路径的最前面确保命令行优先使用我们设置的JDK。保存并退出编辑器在nano中按CtrlX然后按Y确认再按回车。让配置立即生效source ~/.zshrc最终验证执行以下命令检查版本和路径是否正确。java -version你应该看到类似这样的输出其中包含“Temurin”和“build 1.8.0_392”等信息openjdk version 1.8.0_392 OpenJDK Runtime Environment (Temurin-8.0.3928) OpenJDK 64-Bit Server VM (Temurin-8.0.3928) (build 25.392-b08, mixed mode)echo $JAVA_HOME应该输出/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home。至此命令行环境下的JDK 8安装与配置就全部完成了。4. 集成开发环境IDE配置光命令行能用还不够我们的项目通常是在IDE里开发的。这里以最流行的IntelliJ IDEA为例说明如何配置。4.1 在IntelliJ IDEA中配置JDK打开IntelliJ IDEA进入IntelliJ IDEA-Settings...macOS或File-SettingsWindows/Linux。在设置窗口导航到Build, Execution, Deployment-Build Tools-Maven-Runner如果你用Maven这里可以设置Maven运行时的JRE。但更全局的设置是在导航到Build, Execution, Deployment-Compiler-Java Compiler。这里可以查看和配置项目使用的编译器版本。最关键的一步为IDEA添加JDK。打开Project Structure你可以通过File-Project Structure...快速打开或使用快捷键Cmd;。在Project Structure窗口在Project标签页下确保Project SDK已经是你安装的JDK 8。如果没有点击“New...” - “Add JDK...”。在弹出的文件选择器中导航到JDK的安装主目录/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home。选中后点击“Open”。IDEA会自动识别并添加该JDK命名为类似“1.8 (Temurin-8.0.3928)”的名字。在Modules标签页下为你的项目模块选择对应的语言级别如“8 - Lambdas, type annotations etc.”和模块SDK选择刚才添加的JDK 8。点击“OK”保存所有设置。现在你的IDEA项目就已经完全使用JDK 8进行编译和运行了。4.2 在VS Code中配置如果你使用VS Code进行Java开发需要安装“Extension Pack for Java”插件包。配置JDK位置有两种方式通过插件配置按下CmdShiftP输入“Java: Configure Java Runtime”会打开一个界面显示当前检测到的所有JDK。你可以在这里看到Temurin 8并可以设置它为默认。通过settings.json文件在VS Code的设置中搜索“java.home”在Workspace或User设置里添加java.home: /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home通过项目内的配置文件在项目根目录创建.vscode/settings.json文件并添加上述java.home配置这只对当前项目生效。5. 多版本JDK管理与切换现代开发中一台机器上存在多个JDK版本非常常见。我们既需要JDK 8跑老项目也可能需要JDK 17或21开发新服务。如何优雅地管理5.1 使用jenv进行版本管理推荐jenv是一个轻量级的命令行工具可以让你轻松地在多个JDK版本间切换并且为每个目录项目设置特定的JDK版本非常方便。安装jenvbrew install jenv将jenv集成到你的Shell对于Zsh将以下内容添加到~/.zshrc文件中放在之前设置的JAVA_HOME相关行之前或之后都可以但jenv会接管JAVA_HOMEexport PATH$HOME/.jenv/bin:$PATH eval $(jenv init -)然后执行source ~/.zshrc。添加已安装的JDK到jenv# 添加我们刚安装的Temurin 8 jenv add /Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home # 如果你还通过其他方式安装了JDK 11, 17等同样添加进来 # jenv add /path/to/another/jdk查看和管理版本# 列出所有被jenv管理的JDK jenv versions # 设置全局默认JDK版本 jenv global 1.8 # 设置当前shell会话的JDK版本 jenv shell 1.8 # 设置当前目录及其子目录的本地JDK版本非常适合项目级隔离 cd ~/my-java8-project jenv local 1.8执行jenv local后它会在当前目录生成一个.java-version文件里面记录了版本号。以后进入这个目录jenv会自动切换到对应的JDK。实操心得使用jenv后之前手动在~/.zshrc里设置的JAVA_HOME就可以注释掉了因为jenv init脚本会动态设置正确的JAVA_HOME。这避免了手动修改配置文件的麻烦和潜在冲突。5.2 手动切换环境变量如果不使用jenv你也可以通过修改~/.zshrc中的JAVA_HOME变量来手动切换。例如定义多个变量export JAVA_8_HOME$(/usr/libexec/java_home -v 1.8) export JAVA_17_HOME$(/usr/libexec/java_home -v 17) # 默认使用JDK 17 export JAVA_HOME$JAVA_17_HOME export PATH$JAVA_HOME/bin:$PATH # 定义快捷命令别名 alias jdk8export JAVA_HOME$JAVA_8_HOME export PATH$JAVA_HOME/bin:$PATH java -version alias jdk17export JAVA_HOME$JAVA_17_HOME export PATH$JAVA_HOME/bin:$PATH java -version这样在终端里输入jdk8或jdk17就可以快速切换。但这种方法不如jenv的目录级隔离来得精细和方便。6. 常见问题排查与解决实录在实际操作中你可能会遇到一些“坑”。这里记录了几个最常见的问题和解决方法。6.1 问题一brew install --cask temurin8失败提示“Cask ‘temurin8’ is unavailable”可能原因homebrew/cask-versionsTap没有成功添加或者本地缓存过期。解决方案确认Tap已添加brew tap | grep cask-versions。如果没找到再次执行brew tap homebrew/cask-versions。更新所有仓库brew update --verbose。加上--verbose可以看到更详细的更新过程。如果还不行尝试清理Homebrew缓存brew cleanup brew doctor然后重试。6.2 问题二安装后java -version显示的仍然是macOS自带的旧版本Java可能原因macOS系统自带了一个非常老的Java 6或没有并且其路径/usr/bin/java在PATH中的优先级高于我们配置的$JAVA_HOME/bin。解决方案检查PATH变量echo $PATH。确保$JAVA_HOME/bin的路径如/Library/.../bin出现在/usr/bin之前。在~/.zshrc中export PATH$JAVA_HOME/bin:$PATH这一句必须把$JAVA_HOME/bin放在$PATH前面。检查默认Java命令的链接which java。它应该指向$JAVA_HOME/bin/java而不是/usr/bin/java。如果PATH顺序正确但which java结果不对可能是shell缓存问题。关闭终端重新打开或者执行hash -r清除命令缓存再试。使用完整路径测试$JAVA_HOME/bin/java -version。如果这个能正确显示Temurin 8就证明是PATH问题。6.3 问题三Apple Silicon (M1/M2/M3) Mac上程序运行慢或提示架构不兼容可能原因虽然我们安装了ARM64原生版本的Temurin但某些Java应用或启动脚本可能仍然通过Rosetta 2x86_64转译来调用Java或者依赖了某些仅x86的本地库Native Library。解决方案确认Java二进制文件架构运行file $(which java)或file $JAVA_HOME/bin/java。输出中应包含ARM64或arm64字样。如果显示x86_64说明你错误地安装了x64版本。确保安装的是ARM64版CaskHomebrew Cask会根据你的硬件自动选择正确的版本。你可以通过brew info --cask temurin8查看其下载的安装包信息确认是ARM64架构。IDE配置检查在IntelliJ IDEA的Help-About中查看它本身是运行在Apple Silicon还是Intel模式下。建议使用原生Apple Silicon版本的IDE。然后在项目SDK设置中确认指向的是我们安装的原生JDK。终端架构确保你的终端如iTerm2或Terminal运行在原生ARM64模式。你可以通过终端输入arch命令来检查输出应为arm64。如果输出i386说明终端运行在Rosetta 2下它启动的所有进程包括Java默认都会是x86_64模式。你需要为终端应用“获取信息”取消“使用Rosetta打开”的勾选。6.4 问题四Maven或Gradle构建时仍然使用错误的JDK版本可能原因这些构建工具可能有自己的JDK发现机制或配置覆盖了系统的JAVA_HOME。解决方案Maven在命令行运行mvn -v查看Maven使用的Java版本。可以在~/.mavenrc文件中强制设置export JAVA_HOME$(/usr/libexec/java_home -v 1.8)或者在项目的pom.xml中配置maven-compiler-plugin的source和target为1.8但最好还是确保环境变量正确。Gradle检查项目根目录下的gradle.properties文件可以设置org.gradle.java.home/Library/Java/JavaVirtualMachines/temurin-8.jdk/Contents/Home。或者在命令行通过-Dorg.gradle.java.home...参数指定。使用jenv这是最一劳永逸的方法。为你的项目目录执行jenv local 1.8那么在这个目录下运行的所有命令包括mvn、gradle都会自动使用JDK 8。6.5 问题五卸载旧的或错误的JDK安装如果你之前尝试过其他方法安装JDK 8现在想清理干净可以按照以下步骤卸载通过Brew Cask安装的Temurin8brew uninstall --cask temurin8 brew cleanup这会删除应用程序和安装文件。手动删除残留检查以下目录删除与旧JDK相关的文件夹/Library/Java/JavaVirtualMachines/系统级~/Library/Java/JavaVirtualMachines/用户级某些安装方式会放这里对于通过Oracle官网下载的.dmg安装的JDK通常也需要在/Library/Java/JavaVirtualMachines/下找到并删除。清理环境变量编辑~/.zshrc或~/.bash_profile移除或注释掉所有与旧JDK路径相关的JAVA_HOME和PATH设置。使用jenv移除如果用了jenv执行jenv remove 1.8来从jenv的管理列表中移除该版本不会删除实际文件。完成清理后再按照本文的步骤重新安装可以最大程度避免冲突。整个流程走下来从遇到“已停产”的报错到最终在命令行和IDE中都能流畅使用JDK 8你会发现这不仅仅是一次安装更是一次对macOS开发环境管理工具的深入理解。选择TemurinHomebrew Cask的组合配合jenv进行版本管理是目前在Mac上管理Java开发环境最清晰、最可维护的方案之一。
返回列表