刚拿到一台新的阿里云服务器,第一件正经事通常是配Java环境。不管你是准备把Spring Boot项目部署上线,还是想拿一台干净机器练手,这一关都绕不过去。我最近就帮朋友处理了一台刚开通的ECS,从登录系统到项目能通过公网访问,中间踩了不少坑,今天把整个过程完整梳理一遍。这篇文章会把“为什么这样做”也讲清楚,而不只是丢给你一串命令让你复制粘贴。看完之后,换一台服务器、换一个镜像,你也能自己搞定。
如果你是第一次接触云服务器,可以照着本文一步步操作;如果你在Windows上装JDK很熟练,但对Linux下的路径、环境变量、进程管理这些概念比较模糊,那更要耐心看下去。整个流程下来,你会对一套Java应用如何从“本机能跑”变成“服务器上能稳定跑”有一个完整的认知。
提前说明:下面涉及的命令和配置在常见的Linux发行版上基本通用,阿里云ECS和本地虚拟机、物理服务器没有本质区别,只要是Linux这套逻辑,你迁移过去也能用同样的方法配。
1. 先搞清楚这套配置到底在解决什么问题
1.1 一台新云服务器为什么比本机更难搞
在Windows上装Java,基本是下个安装包、双击、下一步,然后IDE自动帮你找到JDK。Linux上没有这种图形化的安装向导,也没有注册表,所谓的“安装Java”,本质上就是两件事:把JDK文件放到服务器某个目录里,然后让操作系统和上层工具知道这个目录在哪。就是这第二件事,卡住了很多人。
云服务器还有一个本机没有的特殊点:访问链路多了一层隔离。你在本机上启动服务,浏览器直接访问localhost就能通;在云服务器上,一个Java进程监听8080端口,并不代表外网就能访问。外面还隔着一层安全组规则和Linux自身的防火墙规则,任一层的端口没放行,你在浏览器里看到的就是“连接超时”或“无法访问”。所以配置Java环境从来不只是“装个JDK”,而是要把系统、版本、环境变量、进程管理、网络放行这几层全部串起来。
1.2 这套方案适合哪些场景
这套配置流程会覆盖几个常见场景。
- 新购ECS服务器后的初始化配置,装好JDK准备跑Java应用。
- 测试环境或生产环境需要快速部署一个Java后端服务,比如Spring Boot项目。
- 服务器迁移、重建、换系统盘之后,需要在一台干净机器上重新复现已有的Java运行环境。
- 学习Linux运维基础,想理解云服务器上为什么需要配置环境变量、为什么需要安全组。
适用范围其实很广。甚至以后你想把阿里云服务器上的环境迁移到本地虚拟机里,操作逻辑也差不多,镜像不同只是包管理器命令不同,核心思想完全一致。下面从动手前的准备开始讲。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手前准备:确认系统、版本和安装路线
2.1 登录服务器并确认Linux发行版
买好阿里云服务器之后,第一件事是登录。你可以在浏览器里打开阿里云控制台,找到实例列表,用“远程连接”里的Workbench直接进入命令行;也可以用本地终端SSH登录,命令格式是:
bash复制ssh 用户名@服务器公网IP
用户名不一定都是root。如果你购买时选择的镜像是Alibaba Cloud Linux或CentOS,默认用户通常是root;如果是Ubuntu,登录名可能是ubuntu或root。不确定的话,去控制台实例详情里看,购买时设置的密码或密钥对就是登录凭证。
登录之后先确认系统类型,这决定了后面用哪套包管理器命令。执行:
bash复制cat /etc/os-release
uname -m
第一行会告诉你操作系统发行版和版本号,第二行输出的是CPU架构。x86_64表示Intel/AMD 64位架构,aarch64表示ARM 64位架构。这两个信息直接决定了后续安装什么版本的JDK包,千万别省略这一步。
常见发行版和对应包管理器如下:
| 系统 | 包管理器 | 安装命令风格 |
|---|---|---|
| Alibaba Cloud Linux 3 / CentOS 7+ | yum / dnf | yum install -y 包名 |
| Ubuntu / Debian | apt | apt install -y 包名 |
| openSUSE | zypper | zypper install 包名 |
大部分阿里云服务器镜像用的是Alibaba Cloud Linux或CentOS,也就是yum/dnf系。下面我会以这套系统为主线,Ubuntu/debian的对应命令也会给出来。
2.2 JDK版本怎么选才不踩坑
Java的版本选择是个老话题。目前主流的长期支持版本(LTS)是Java 8、11、17、21。企业里老项目大部分还在Java 8上跑,尤其是一些传统行业系统;新项目用Java 17已经非常普遍,因为性能和语法特性都有提升;Java 21算是比较新的长期支持版本,适合全新的项目尝鲜。
如果是自己学习,建议直接装一个较新的稳定版,比如Java 17,没必要刻意去装已经被时代淘汰的旧版本。如果是公司项目部署,优先看项目本身的编译要求,pom.xml或build.gradle里写的是什么Java版本,服务器上就装对应的版本。我见过不少同事在服务器上装了Java 17,结果项目是Java 8编译的,启动直接报UnsupportedClassVersionError,这就是版本没对齐造成的。
另外,OpenJDK和Oracle JDK在实际使用上对绝大多数项目没有差异。你真的不需要纠结于是哪个发行版,关键是安装包里的版本号必须匹配你的项目编译级别。阿里云服务器通过yum或apt安装的默认就是OpenJDK,可以放心用。
2.3 两条安装路线怎么取舍
在Linux上安装JDK,主流方法有两个:
- 用包管理器安装,比如
yum install -y java-17-openjdk-devel。 - 手动下载tar.gz包解压到指定目录,然后自己配置环境变量。
这两种方式没有绝对的好坏,实际选哪种要看你使用环境。
用包管理器安装的最大优势是方便,一条命令装完,系统会自动在/usr/bin下建立java和javac的软链接,你不用手动配置PATH,后续升级也能用包管理器统一管理。缺点是仓库里的版本可能不是最新的,而且不同发行版的包名不一样,有的叫java-11-openjdk,有的叫openjdk-11-jdk,需要稍微适应。
手动解压安装的优点是完全可控。你可以把JDK固定放在 /usr/local 下某个目录,版本自己说了算,同一个服务器还可以同时放多个JDK版本,通过切换软链接来切换。缺点是所有环境变量都要自己配置,对新手来说多了一些理解成本。
我的建议是:自己练习、快速搭环境,直接用包管理器;如果是公司生产环境、有多人共用的服务器、对JDK小版本有严格约束,就用手动解压方式。下面两条路我都会讲,你按实际情况选。
3. JDK安装实操:包管理器方式与手动解压方式
3.1 最省心的包管理器安装
如果你不纠结具体的小版本号,也不想折腾路径,那这一步很简单。
Alibaba Cloud Linux / CentOS 系统执行:
bash复制sudo yum install -y java-17-openjdk java-17-openjdk-devel
Ubuntu / Debian 系统执行:
bash复制sudo apt update
sudo apt install -y openjdk-17-jdk
注意这里有个关键点:一定要装带-devel后缀的包,或者直接装-jdk包,不能只装java-17-openjdk。只装基础包可能只有JRE,运行java -version能正常输出,但javac命令不存在。
以前我就踩过这个坑:装完执行java -version一切正常,以为环境配好了,结果到项目目录里跑mvn clean package,怎么都要编译,后来才发现是javac根本没装。用包管理器安装时,顺手把javac也验证了,能省很多事。
包管理器安装后,java和javac命令其实已经可以直接用了,因为系统自动在/usr/bin下创建了软链接。不过很多工具还是需要环境变量JAVA_HOME,所以不能跳过第4章的环境变量配置。
3.2 更可控的手动解压安装
手动安装适合追求版本可控的场景。首先你要有一个JDK的tar.gz包,比如 jdk-17_linux-x64_bin.tar.gz,把它上传到服务器。上传方式很多,最常见的是在本地终端执行:
bash复制scp jdk-17_linux-x64_bin.tar.gz 用户名@服务器公网IP:/tmp/
上传完成后,按下面步骤解压和安装到/usr/local目录:
bash复制sudo mkdir -p /usr/local
sudo tar -zxvf /tmp/jdk-17_linux-x64_bin.tar.gz -C /usr/local
sudo mv /usr/local/jdk-17.0.10 /usr/local/java17
这里有个经验值得多说一句:解压出来的目录常常叫jdk-17.0.10这种带版本号的名字,我不建议直接把它改名为/usr/local/java,而是保留版本目录,再用一个不带版本号的软链接指向它:
bash复制sudo ln -s /usr/local/java17 /usr/local/java
这样设计的好处是以后升级JDK时,只要把新的JDK解压到/usr/local/java21,再删掉旧软链接、新建指向新版本的软链接,环境变量完全不用动。软链接在Linux里就相当于Windows的快捷方式,你该理解它的用途了。
如果你的服务器是ARM架构,记得下载对应aarch64的JDK包,arm机器上强行跑x64的JDK会直接报无法执行错误,这个在6.2节细说。
3.3 装完必须做的第一轮验证
不管用哪种方式安装,装完都要做第一轮基础验证。执行:
bash复制java -version
javac -version
which java
which javac
期望的java -version输出类似:
code复制openjdk version "17.0.10" 2024-01-16 LTS
OpenJDK Runtime Environment
OpenJDK 64-Bit Server VM
javac -version也要有正常版本号。如果java -version正常但javac提示找不到命令,说明你只装了JRE或者包没装全,回到前面的命令重新装开发版。
which java的作用是查看命令实际所在位置。如果它输出/usr/bin/java,再配合readlink -f /usr/bin/java就能看到真实JDK目录,这个信息在配JAVA_HOME时经常要用到。建议现在就把这条命令跑一下,把路径记下来,下一步配置环境变量会用到。
4. 环境变量配置逐行拆解
4.1 JAVA_HOME、PATH、CLASSPATH分别管什么
很多Linux环境配置教程上来就让你写三行export,但不解释每行的作用,看完跟没看一样。这里我拆开讲清楚。
JAVA_HOME 是给第三方工具用的。Maven、Gradle、Tomcat、IDEA这些工具启动时会通过这个变量去寻找JDK的安装目录,从而定位到bin/java和bin/javac。Java运行时本身并不依赖这个变量,但你要构建项目、要让Tomcat能跑起来,没有它就不行。
PATH 是让Shell在输入java或javac时,能自动到$JAVA_HOME/bin目录下找到对应的可执行文件。否则每次都要输入/usr/local/java/bin/java这种
