Java从环境到类与对象 · SSH 实操

开始之前 · 环境准备

环境准备与 SSH 连接

用 Windows 终端连接自己的阿里云服务器,加载课程 JDK 17,建立练习目录,学会 nano 保存、编译与运行。全程在服务器上操作,网页不执行命令、不接收密码。

这是教程网页,不是在线运行环境。Java 代码和 SSH 命令都要在你的服务器上执行;网页不会执行代码、不会连接服务器、也不会接收密码。

这一页只做一件事:把你的电脑连到你自己的阿里云服务器,确认 JDK 17 能用,然后建好练习目录。后面的 12 节都假设你已经完成这一页。

先记住一句话:网页只是教程,不是在线编译器。 你在网页上看到的 Java 代码和命令,都要复制到右边的 SSH 终端里,在服务器上编译、运行。网页不会执行代码,不会连接服务器,也不会接收密码。

1. 打开终端,连接服务器

在 Windows 上打开 Windows Terminal(开始菜单搜索“终端”或“Windows Terminal”),用默认的 PowerShell 标签即可。Windows 10/11 自带 ssh 命令,不需要额外安装。

在终端里输入下面这一行,不要照着网页复制尖括号里的示例 IP:

SSH 服务器终端bash
$ ssh root@<你的阿里云公网IP>

把 <你的阿里云公网IP> 整个替换成你自己服务器的公网 IP,尖括号 < > 不要保留。例如你的 IP 是 203.0.113.10,就输入 ssh root@203.0.113.10。

  • 用户名是 root,这是阿里云服务器常见的登录账号。
  • 密码就是你平时登录这台服务器的那个密码。本文和网页都不会写出、保存或显示密码。
  • 输入密码时屏幕上不会出现星号或字符,这是 Linux 的正常行为;输完直接按 Enter。
  • 第一次连接会问 Are you sure you want to continue connecting (yes/no)?,确认主机名/IP 是你自己的服务器后输入 yes 再回车。
  • 如果你平时用密钥登录,就按你原来的方式登录;本页不提供、也不需要把密钥写进网页。

登录成功后,最后一行会出现类似下面的提示符,表示你已经在这台服务器上了:

输出示例(只读)output不可复制
root@your-server:~#

提示符的样子会随主机名和配置变化,可能是 root@host:~#,也可能是别的。提示符不是命令的一部分,不要复制它。 本页为了统一,命令示例前面用 $ 表示“这是在终端里输入”;你的 root 窗口实际可能显示 #,$ 和 # 都只是提示符。

2. 每次新开终端,先加载 JDK 17

服务器默认的 PATH 里故意没有 Java,避免影响服务器上的其它服务。所以每开一个新的 SSH 窗口,都要先执行一次:

SSH 服务器终端bash
$ source ~/java-practice/env.sh

看到类似下面的提示,说明加载成功:

输出示例(只读)output不可复制
Java 学习环境已就绪:javac 17.0.20.1  (JAVA_HOME=/opt/java-learning/jdk17/usr/lib/jvm/java-17-openjdk-amd64)

然后检查两个命令:

SSH 服务器终端bash
$ java -version
$ javac -version

预期输出(版本号应为 17.0.20.1):

输出示例(只读)output不可复制
openjdk version "17.0.20.1" 2026-08-18
OpenJDK Runtime Environment (build 17.0.20.1+1-1-26.04-Ubuntu)
OpenJDK 64-Bit Server VM (build 17.0.20.1+1-1-26.04-Ubuntu, mixed mode, sharing)
javac 17.0.20.1

说明:

  • java -version 把版本信息写到标准错误(stderr),所以看起来像“红字”或“错误输出”,这不是报错。
  • 只要看到 17.0.20.1 就可以继续;如果看到 command not found,说明这个窗口还没 source,回到本节第一行再执行一次。
  • 不要用 apt install 自己安装 JDK。服务器上还有别的服务,装错版本会影响别人;课程环境已经准备好了。
  • source 只影响当前这个终端窗口。关掉窗口或新开一个 SSH 标签,要重新执行一次;重复执行不会把 PATH 叠加两次。

如果你不想每次 source,也可以用一个等价的入口命令:

SSH 服务器终端bash
$ java-lab

它会进入一个已经配好 JDK 17 的子 shell。注意:在 java-lab 里输入 exit,只退出这个子 shell,回到你原来的 SSH 登录 shell;再输入一次 exit,才会断开服务器。用 source 的方式则没有这层子 shell,exit 一次就断开 SSH。

3. 建练习目录,先看有没有旧文件

先建一个自己的练习目录。mkdir -p 的意思是“目录不存在就创建,已经存在也不报错”;cd 进入目录;pwd 显示当前所在位置。

SSH 服务器终端bash
$ mkdir -p ~/java-practice/hello
$ cd ~/java-practice/hello
$ pwd

预期输出(pwd 应显示你的家目录下的 java-practice/hello):

输出示例(只读)output不可复制
/root/java-practice/hello

在写文件之前,先看看目录里有没有同名的旧文件:

SSH 服务器终端bash
$ ls -la

如果看到已经有 Hello.java,不要直接覆盖或删除它。Linux 不会像 Windows 那样自动帮你保留旧版本;下面的命令只在文件存在时把它改名备份,文件名带时间戳,不会覆盖已有的备份:

SSH 服务器终端bash
$ if [ -e Hello.java ]; then mv Hello.java "Hello.java.bak.$(date +%s)"; fi

这条命令不会删除任何文件:文件不存在时它什么也不做;存在时只是改名。备份之后,你可以用 ls -la 看到 Hello.java.bak.数字,旧内容还在。

4. 用 nano 写 Hello.java

nano 是服务器上最简单的文本编辑器。**nano 要单独占一个命令块**:如果你把 nano Hello.java 和后面的 javac 一起粘贴,编辑器会把后面的命令当成文件内容,看起来像“卡住”。

SSH 服务器终端bash
$ nano Hello.java

打开后,把下面这一整段 Java 源码粘贴进去:

Java 源码Hello.java
public class Hello {
    public static void main(String[] args) {
        System.out.println("你好,Java!");
    }
}

粘贴后按下面的顺序保存并退出:

  1. 按 Ctrl+O(字母 O,不是数字 0),屏幕底部会问文件名;
  2. 直接按 Enter 确认;
  3. 按 Ctrl+X 退出编辑器。

记不住就念一遍:Ctrl+O、Enter、Ctrl+X。

几个必须注意的点:

  • 文件名必须是 Hello.java,大写 H。Linux 区分大小写,hello.java、Hello.Java 都不行。
  • Java 里 public class Hello 的类名必须和文件名一致;这个类叫 Hello,文件就只能叫 Hello.java。
  • 文件内容里不要写终端提示符 $ 或 #,也不要写 nano 的命令;只放 Java 源码。
  • 你不需要在 Windows 上安装 Java 或 IDEA。javac 和 java 都在服务器上运行,Windows 只负责显示终端。

如果你粘贴时终端提示“是否粘贴多行”,选择允许粘贴即可。Windows Terminal 里通常可以右键粘贴,也可以按 Ctrl+Shift+V;复制网页内容可以用鼠标选中后 Ctrl+C。粘贴进 nano 后,先检查花括号和引号有没有缺。

5. 编译,再运行

先编译:

SSH 服务器终端bash
$ javac -encoding UTF-8 Hello.java

这条命令把 Hello.java 编译成 Hello.class。-encoding UTF-8 是告诉编译器源码是 UTF-8,源码里有中文时更稳妥。编译成功时没有任何输出,直接回到提示符,这是正常的。

再运行:

SSH 服务器终端bash
$ java Hello

预期输出:

输出示例(只读)output不可复制
你好,Java!

java 后面写类名 Hello,不要写 Hello.class,也不要写 java Hello.java。前者是“运行已经编译好的类”,后者是另一种源码启动方式,本课程统一使用“先 javac 编译、再 java 运行”的两步法,便于你看清每一步在做什么。

如果编译报错,先看报错里的文件名和行号,再回到 nano 修改:

  • class Hello is public, should be declared in a file named Hello.java:文件名和类名不一致,检查大小写。
  • error: cannot find symbol:某个单词拼错了,或者少写了分号/括号。
  • error: reached end of file while parsing:花括号没有成对闭合。

改完保存(Ctrl+O、Enter、Ctrl+X),再重新执行 javac 和 java。

6. 程序停下来等你输入,不是死机

后面用到 Scanner 的课,程序运行后会停住,等你从键盘输入。比如屏幕出现“请输入姓名:”时,程序是在正常等待输入,不是服务器卡死。

在终端里输入内容,按 Enter,程序就会继续。按 Ctrl+C 可以强制结束你自己正在运行的这个 Java 程序,回到 shell 提示符;它不会关掉服务器,也不会影响别人的服务。只有在程序等待输入或运行太久时,才需要这样做。

网页上的 output 块是“预期输出”,只读,不能复制;input 块是“程序需要的输入示例”,也是只读。不要把输出或输入当成命令粘贴回终端。

7. 这套环境的边界

  • JDK 是 OpenJDK 17.0.20.1,课程以 Java SE 17 为运行基线;JDK 8/11 的常见写法可以编译运行,JDK 21 独有的预览特性不保证可用。
  • 没有 IDE、图形界面、Maven/Gradle;编译错误是 javac 的英文输出,行号是准的。
  • 本阶段课程不涉及用 Java 访问 HTTPS 网站。这个解包环境没有生成完整的 cacerts 证书库,自己写 HTTPS 客户端会报证书错误;这是环境限制,不是本课程要解决的问题,也不影响 javac/java 的基础练习。
  • 服务器上原有的 nginx、MySQL 学习库等服务和数据库都不要动;本课程只使用 ~/java-practice 下的练习目录。

8. 每次回来先做这三步

新开一个终端窗口时,按顺序做:

SSH 服务器终端bash
$ ssh root@<你的阿里云公网IP>
$ source ~/java-practice/env.sh
$ java -version && javac -version

看到 17.0.20.1,就可以回到课程目录,从下一节继续。如果 source 说找不到文件,或者版本不是 17,先停在 setup 页排查,不要自己装 JDK,也不要改系统环境。