尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Linux服务器部署OpenJDK 11.0.24:从下载到systemd全流程

Linux服务器部署OpenJDK 11.0.24:从下载到systemd全流程 简介面向 Linux x64 平台下的 Java 开发者、运维人员和软件学习者这是一份 Microsoft Build of OpenJDK 11.0.24 的完整二进制发行包。OpenJDK 11 属于长期支持LTS版本免费开源可直接部署在 x64 服务器或桌面系统解决 Java 11 运行环境与核心开发工具链的搭建问题适合作为本地 JDK、容器基础镜像或 CI 构建环境的候选安装包。压缩包共含 509 个文件约 188.13MB信息完整除 java、javac、javadoc、jshell、jlink、keytool 等常用命令外还包含 72 个 jmod 模块文件、38 个 so 动态库、大量 license 与 md 说明文档以及 75 个 man 手册页解压后配置 JAVA_HOME 即可直接使用。已有 366 人学习或下载通过模块文件、授权清单和命令行工具也能了解 OpenJDK 的模块化组成与合规使用方式对搭建、调试和迁移 Java 环境都有实际参考价值。 前两天帮朋友部署一台测试服务器系统是最新的 Rocky Linux 9项目要求明确写着“Linux 64 位 OpenJDK 11.0.24”——既不能图省事装个 17 糊弄过去也不能直接用包管理器拉个默认版本就完事。折腾完我顺手把整个流程记了下来里面有几个细节真的是不踩一次坑根本记不住。这篇东西适合谁看呢刚拿到一台 Linux 服务器准备搭 Java 环境的新人或者被“需要指定 OpenJDK 小版本号”这种需求卡住的老手应该都能找到点有用的东西。我会从版本背景讲起然后按照“准备工作 → 手动部署 → 服务化 → 排错”的顺序展开把我实际操作中验证过的步骤和翻过车的注意点都写出来。1. 先搞清楚你装的是什么11.0.24 这个版本号背后的信息1.1 为什么偏偏是 OpenJDK 11还是 11.0.24OpenJDK 是 Java 的开源参考实现绝大多数发行版里预装的 java 命令底层其实就是 OpenJDK。Java 语言的版本号遵循 JEP 322从 Java 10 之后改成了基于时间的版本命名主版本号.特性版本号.安全版本号。所以 11.0.24 的含意很直白——主版本是 11安全更新已经推到第 24 个。Java 11 是 Oracle 官方定义的 LTS长期支持版本这个身份太重要了。很多企业的老项目都锁定在 Java 8 或 Java 11 上尤其是 Spring Boot 2.x 系列的生态在 Java 11 上跑得非常成熟稳定。而 11.0.24 这个具体小版本是 2024 年 7 月发布的季度安全更新版本对应 Oracle 的 Critical Patch Update修掉了一批安全漏洞和稳定性问题。这里有个很多新手会忽略的点需求里如果写了具体的 OpenJDK 小版本号通常意味着这是经过安全审计或生产验证指定的版本不能拿个相近版本代替。比如你装成了 11.0.23可能就差了一个安全补丁安全扫描就直接不通过。所以下载前先确认版本号一个数字差都不能妥协。1.2 发行版怎么选官方构建、Temurin 还是系统源你可能会问OpenJDK 不就是一个东西吗为什么还有这么多选择实际上 OpenJDK 是“上游源码”各家拿到源码后自己编译、打包、测试就有了不同的发行版。常见的包括发行版维护方特点适用场景Oracle OpenJDKOracle官方构建短周期更新频繁追求最新补丁、开发调试Eclipse TemurinAdoptium 社区生产级、免费商用、TCK 认证企业生产环境首选Amazon CorrettoAWS长期支持免费AWS 生态、兼容性验证Azul ZuluAzul多平台支持广特殊架构、嵌入式场景系统源内置版本发行版厂商安装最方便、跟随系统更新快速部署、无特殊版本要求对你这次安装 11.0.24 这个特定版本来说如果只追求“能在 Linux 64 位上跑起来”用 apt/yum 装系统源里的版本最省事但系统源里的版本号不一定能精确匹配 11.0.24。所以我的建议是手动下载 tar.gz 包部署这也是最可控、最容易复现的方式。下面以 Eclipse Temurin 的构建为例展开因为它的下载链接格式清晰版本号能精确对应而且生产环境用得很广。2. 安装前先花十分钟做准备2.1 确认系统架构和现有环境动手之前先确认这台机器的架构。标题里写了“64 位”但 64 位还有 x86_64 和 aarch64 之分下载错了包是解压不了的。用一行命令看uname -mx86_64 就是最常见的 Intel/AMD 服务器架构aarch64 是 ARM 架构的 64 位。这两者的 JDK 二进制包不能互换下载的时候一定看清楚。然后检查当前环境里是不是已经有 Javawhich java java -version如果输出了一堆东西说明系统里已经有 JDK 了。这时候先别急着卸载要看清楚是哪个发行版、哪个版本。有些系统组件依赖 OpenJDK比如某些版本的 Jenkins、Elasticsearch你手动装新的覆盖了老的可能影响这些组件。如果只是纯跑业务应用确认没有其它服务依赖旧版本后可以把老的卸载或者保留但把 JAVA_HOME 指到新版本上。2.2 规划目录与专用运行用户很多人的习惯是随便解压到 /root 或者 /home 下图一时方便。但我强烈建议你遵循 FHSFilesystem Hierarchy Standard的惯例把 JDK 放在/opt/java下。理由有三后续升级版本时只需要替换软链接不用改系统配置。/opt 目录语义清晰运维一看就知道这是第三方安装的软件。不会污染 /usr/local 下其它工具链的布局。如果你要在生产环境跑 Java 应用还应该顺手创建一个专用的系统用户。用 root 跑 Spring Boot 服务这类操作一旦被入侵整个服务器就裸奔了。创建用户的命令sudo useradd -r -m -s /bin/bash javaapp-r表示创建系统用户-m创建 home 目录-s指定登录 shell。后面配置 systemd 服务的时候这个用户就能直接用上了。3. 手动部署 OpenJDK 11.0.24 的完整流程3.1 下载与解压版本确定的关键一步选好发行版和架构后去 Adoptium 的 API 页面拿到具体的 tar.gz 下载链接。比如对 x86_64 Linux 系统OpenJDK 11.0.24 对应的 Temurin 构建链接大概是cd /tmp wget https://api.adoptium.net/v3/binary/latest/11/ga/linux/x64/jdk/hotspot/normal/eclipse这个地址会自动跳转到最新 GA 的 11 版本 tar.gz。如果你需要精确定位到 11.0.24 这个历史版本建议直接打开 Adoptium 的 archive 页面按版本号过滤下载文件名里会明确带着11.0.247这样的字眼。下载完先用 sha256sum 校验一下文件完整性这一步能挡住大多数下载损坏问题sha256sum jdk-11.0.247-linux-x64.tar.gz然后解压到规划好的目录。这里有个经验tar 包解压出来的目录名通常带 build 号比如 jdk-11.0.247我习惯把目录重命名成简洁的版本号再用软链接统一管理这样后续升级方便得多sudo mkdir -p /opt/java sudo tar -zxvf jdk-11.0.247-linux-x64.tar.gz -C /opt/java cd /opt/java sudo mv jdk-11.0.247 jdk-11.0.24 sudo ln -sfn jdk-11.0.24 current3.2 环境变量配置JAVA_HOME 千万别抄错解压完还不能直接用因为 shell 默认找不到 java 命令。网上教程千篇一律让你改/etc/profile这个做法能用但不够优雅——所有用户、所有登录会话都会刷一遍配置一旦写错影响面太大。我的推荐做法是新建一个独立的/etc/profile.d/java.sh系统登录时它会自动被/etc/profile加载逻辑清晰卸载时删一个文件就行sudo vim /etc/profile.d/java.sh里面写入export JAVA_HOME/opt/java/current export PATH$JAVA_HOME/bin:$PATH export LANGen_US.UTF-8这里有两个新手高频踩坑点。第一JAVA_HOME 必须指向 JDK 的根目录也就是包含 bin、lib、conf 这些子目录的层级而不是指向 bin 目录。第二PATH里要把$JAVA_HOME/bin放在$PATH前面这样才能覆盖系统自带的旧版本 java。至于 CLASSPATH现在主流 JDK 已经完全不需要手动设置了网上老教程里那种export CLASSPATH.的写法建议直接忽略画蛇添足反而可能引发类加载混乱。配置生效source /etc/profile.d/java.sh hash -r3.3 验证安装与简单编译测试环境变量配置完验证这个环节千万不能省。执行java -version javac -version正常情况下应该看到类似输出openjdk version 11.0.24 2024-07-16 OpenJDK Runtime Environment (build 11.0.247) OpenJDK 64-Bit Server VM (build 11.0.247, mixed mode, sharing)注意输出里明确有64-Bit字样说明这是 64 位版本和标题要求对上了。如果这里显示的还是老版本别急第 5 节会专门讲怎么排查。版本号看着对不代表真的能编译。我每次装完都会写一个最小的 HelloWorld 验证一遍编译和运行链路cat /tmp/Hello.java EOF public class Hello { public static void main(String[] args) { System.out.println(OpenJDK 11.0.24 works: System.getProperty(java.version)); } } EOF javac /tmp/Hello.java java -cp /tmp Hello能正常打印出OpenJDK 11.0.24 works: 11.0.24就说明编译和运行两个环节都通了。这一步用不了两分钟但能提前暴露权限、路径、编码等方面的问题。4. 让 Java 应用以服务方式跑起来4.1 用 systemd 管理 Java 服务装好 JDK 后真正的考验来了怎么让 Java 应用稳定地跑在后台上。直接java -jar app.jar 这种裸跑方式session 一断进程就可能跟着没重启机器后还得手动拉起根本不具备可维护性。正确做法是交给 systemd 管理。在/etc/systemd/system/myapp.service里写[Unit] DescriptionMy Java Application Afternetwork.target [Service] Typesimple Userjavaapp Groupjavaapp EnvironmentJAVA_HOME/opt/java/current EnvironmentJAVA_OPTS-Xms256m -Xmx512m -Dfile.encodingUTF-8 ExecStart/opt/java/current/bin/java $JAVA_OPTS -jar /opt/myapp/app.jar SuccessExitStatus143 Restarton-failure RestartSec5s [Install] WantedBymulti-user.target几个关键点说一下。User和Group指定了之前创建的系统用户 javaapp这样应用进程就跑在非 root 权限下安全很多。Restarton-failure是生产环境必备进程异常退出时自动拉起5s间隔可以防止快速重启风暴。SuccessExitStatus143是因为 Java 应用收到 SIGTERM 信号退出时状态码是 143你不声明这个systemd 可能把它当成异常退出。配好之后执行sudo systemctl daemon-reload sudo systemctl enable --now myapp sudo systemctl status myapp这样服务随机器开机自启崩溃自动重启日志用journalctl -u myapp -f就能实时追踪运维体验直接上升一个台阶。4.2 多版本共存时的版本切换一台机器上装多个 JDK 版本是常态比如老项目要 Java 8新项目要 Java 11。手动改 JAVA_HOME 太累这里有两个办法。一个是 Linux 自带的 alternatives 机制sudo alternatives --install /usr/bin/java java /opt/java/jdk-11.0.24/bin/java 11024 sudo alternatives --config java执行 alternatives --config 后会出现一个交互菜单选择你想要的那个版本就行。这个机制对 jdk、javac 都要分别做稍显繁琐。另一个是现代开发环境更常用的 SDKMAN。它支持安装和管理多个 JDK 发行版切换只需一条命令sdk list java sdk install java 11.0.24-tem sdk use java 11.0.24-tem不过 SDKMAN 默认装在用户目录下适合开发者个人环境生产服务器上用 alternatives 或者直接改软链接更符合运维习惯。哪种方式没有绝对最优关键看你的使用场景。5. 部署过程中常见的坑与排查思路5.1 命令找不到或版本没变化排第一的经典问题配完环境变量、执行完java -version结果还是bash: java: command not found或者显示的版本还是系统里的老版本。先确认是不是 PATH 没生效echo $JAVA_HOME echo $PATH如果 JAVA_HOME 有值但 PATH 里没有 $JAVA_HOME/bin说明 profile 脚本的 export 没写对或者 source 之后没重新登录。如果两个值都正常但 java 还是老版本看一下实际调用的路径which java输出如果指向/usr/bin/java说明 PATH 里 $JAVA_HOME/bin 被排到了后面或者是因为之前用过 update-alternatives 设置了系统级软链接。这时候用hash -r清一下 shell 的命令哈希再不行就把 PATH 顺序调整一下。你还可以独立验证 JDK 本身是否正常/opt/java/current/bin/java -version这个命令能直接跳过所有环境变量问题如果输出正常问题一定出在 PATH 或 alternatives 配置上。5.2 下载慢、页面打不开怎么办从 Adoptium 官网下载 tar.gz在国内网络环境下确实可能比较慢。这种情况可以选择国内镜像源操作上更顺手的是清华 TUNA 镜像站或华为云镜像站它们都在持续同步 openjdk 相关的二进制构建产物。下载前记得对比文件名里的版本号和 sha256 校验值防止从非官方渠道拿到被篡改的包。另外一个小技巧如果只是想在 Linux 上快速装一个能跑的 OpenJDK 11系统源里的版本通常也完全够用。Ubuntu/Debian 系执行sudo apt install openjdk-11-jdkCentOS/RHEL 系执行sudo yum install java-11-openjdk-devel。这个方案省事但版本号可能略滞后于 11.0.24到底用不用系统源取决于你的需求对精确版本号的强依赖程度。5.3 应用启动报错与编码问题环境装好、服务也跑起来了但服务一启动就报Error: Could not create the Java Virtual Machine。这一般不是 JDK 本身的问题而是启动参数不对——比如 -Xmx 设置超过了服务器剩余内存或者堆大小配置低于默认阈值。用free -h先看看物理内存再调整 systemd 里的 JAVA_OPTS 就行。还有一个经常被忽略的是字符编码。很多 Java 应用在 Linux 上处理中文会出现乱码根源是系统 locale 不是 UTF-8。在启动参数里明确加上-Dfile.encodingUTF-8是最稳妥的方案同时保证/etc/profile.d/java.sh里设置了LANGen_US.UTF-8双管齐下基本可以告别乱码。5.4 环境变量改了服务里不生效这个坑我最初也踩过自己用 shell source 一下环境变量java 命令能用了但 systemd 服务还是报找不到 java。原因是 systemd 服务默认只继承极少的系统环境变量它在服务启动时根本不会去读/etc/profile。解决方法就是在 service 文件里通过Environment字段显式声明路径或者干脆用绝对路径启动ExecStart/opt/java/current/bin/java -jar /opt/myapp/app.jar这样最直接也最不容易出幺蛾子。很多人以为自己配置环境变量失败了实际上是被 systemd 这套机制坑了看到这里你应该能避开。写在最后的一点实操体会说实话部署 JDK 这件事看起来就是“解压配置环境变量”两步走但真正上手就会发现细节决定成败。我做这套流程的次数多了以后最大的体会是一定要把部署过程脚本化。把下载、校验、解压、软链接、环境变量、验证这些步骤写成一个 install_jdk.sh 脚本保存下来下次装新服务器直接跑一遍半小时的活压缩到三分钟还不会因为手一抖漏掉某个步骤。另外版本管理这件事不要相信“临时先装一个以后再说”时间长了机器上留着多个版本的 JDK 是常态。从一开始就把目录结构规划好、软链接规则定好后面维护会省出很多无谓的折腾。如果你也正好在部署 11.0.24 这个版本照着我上面的流程走一遍中间遇到我列过的报错就回来看一眼排查思路大概率十分钟内能搞定。本文还有配套的精品资源点击获取
返回列表