很多刚转行或者刚入门编程的朋友,一上来就装了个图形化开发工具,点几个按钮把程序跑起来,就以为这就是Java。直到进了项目组,发现同事都在一个黑乎乎的DOS窗口里敲命令编译、打包、启动服务,当场就懵了。这不是什么冷漠的考验,而是你迟早要补上的一课。Java天生是一个命令行基因很重的语言,哪怕现在的开发工具再成熟,它的底层工作逻辑依然清晰得可怕:一条命令负责把源代码翻译成字节码,一条命令负责把字节码交给虚拟机执行。这篇指南就把这两件事彻底讲一遍,一边覆盖Windows系统里最高频的实用DOS命令,一边带你在纯命令行的环境下,亲手完成第一个Java程序的编写、编译和运行。适合零基础刚接触Java的朋友,也适合已经会点开发工具、但想补命令行底子的人。
1. 别急着装IDE:为什么从DOS窗口开始学Java
1.1 Java程序的“两段式”运行逻辑
Java和你平时接触的很多东西都不一样。比如双击一个exe,操作系统直接就能加载运行;但Java程序不行,它必须经过两个阶段。
第一阶段叫编译。你写出来的源文件是给人看的,后缀是.java,里面全是英文单词和符号。计算机的CPU不认这个东西,所以需要一把“翻译尺”,把.java文件翻译成一种中间形态,叫字节码,文件后缀是.class。完成这个翻译动作的命令是javac——Java Compiler,Java编译器。
第二阶段叫运行。翻译出来的.class文件依然不是机器码,它需要由Java虚拟机(JVM)来读取和解释执行。负责这一步的命令是java。你敲java Hello,虚拟机会在当前目录里找到Hello.class,然后从里面的main方法开始,一行一行往下执行。
很多初学者第一次听说“JVM”“字节码”这些词就头大。我的建议很简单:先别管虚拟机内部怎么工作的,你只需要死死记住一条链路——.java经javac变成.class,*.class经java在虚拟机上运行。后面遇到所有编译运行相关的报错,九成都能靠这条链路推出来。
1.2 IDE到底替你做了什么
图形化开发工具(IDE)之所以受欢迎,是因为它把上面两个阶段彻底藏了起来。你点了那个绿色三角按钮,它会自动调用javac帮你编译,自动把编译产物放到指定目录,自动拼好classpath参数,最后再调用java把你的程序跑起来。整个过程在一秒内完成,你只看到“运行成功”。
听起来很方便,但对刚入门的人来说,这种方便其实是一种“温柔的陷阱”。因为当程序运行失败,IDE给出的错误提示往往是一个很长的堆栈信息,新手根本不知道它是从哪个环节冒出来的。哪里编译错了?哪里没找到类?哪里依赖缺失?如果你完全没有命令行编译运行的经验,这些报错在你眼里就是一串乱码。
反过来,你在DOS窗口里亲手敲过一遍命令,看到javac Hello.java生成了一个Hello.class,再敲java Hello跑出结果,那么你对Java程序的结构会有一种“看得见、摸得着”的理解。以后再回IDE里点按钮,你心里知道它背后在干什么,遇到问题也更容易定位。
1.3 DOS窗口的三个隐性优势
除了帮你看清编译运行的本质,在DOS窗口里干活还有三个实打实的好处。
第一,环境一致性。你以后要面对的生产服务器,绝大多数是没有图形界面的,只有命令行。无论你之后接触的是Linux、Windows Server还是某些云平台的容器环境,底层操作都是敲命令。早点习惯在命令行里干活,后面适应服务端工作会顺畅得多。
第二,命令本身是“可复述”的技能。图形界面上的操作往往依赖鼠标点击位置,很难记录下来传给同事;但命令行不同,一行命令复制发过去,对方一跑就有同样的结果。你学到的DOS命令,天然就是可沟通、可复现的。
第三,能培养看报错的胆量。我见过不少新人,一看到红色错误信息就慌。其实命令行给你的报错是最直白的,它会告诉你第几行出问题、哪个符号不合法、程序包不存在。多和这些报错打交道,你会慢慢发现:报错不是失败的标志,而是系统在努力告诉你哪里不对。这种心态,比会写几行代码值钱很多。
2. 高频实用DOS命令:新手够用版
2.1 打开命令窗口的几种方式
在Windows系统里,“DOS窗口”这个叫法虽然不严谨(现在实际上是PowerShell或命令提示符),但大家都习惯了。你至少要学会两种打开方式,因为不同场景下效率差很多。
第一种,快捷键方式。按下Win+R组合键,在弹出的运行框里输入cmd,回车即可。这个方式适合任何时候快速叫出一个黑窗口。
第二种,在文件夹里直接打开。如果你已经在“我的电脑”里定位到了某个目录,比如D盘下的java-work文件夹,可以直接在地址栏里输入cmd并回车。这样打开的窗口会自动停留在当前目录,省去后面输入cd切换目录的功夫,非常实用。
如果只是平时学习,普通权限就够用了。只有个别系统级命令才需要管理员权限,具体操作可以右键“命令提示符”选择“以管理员身份运行”。对入门阶段来说,不需要频繁使用管理员窗口。
2.2 目录与文件查看:cd、dir、盘符切换
打开命令窗口后,你首先会看到一个提示符,类似C:\Users\你的用户名>。这表示当前所在目录是C盘的用户目录。接下来最重要的命令就是切换目录。
cd是Change Directory的缩写,用法注意几个细节:
- cd..表示返回上一级目录。
- cd\表示直接回到当前盘符的根目录,注意是反斜杠\。
- cd /d D:\java-work表示跨盘符切换。如果只是在C盘内部切换,不带/d也行;但要跳到D盘目录,最好带上/d。
- 直接输入D:回车,可以快速切换到D盘根目录,这种方式切换盘符不需要cd。
dir命令用来列出当前目录下的文件和文件夹。不带任何参数时,会显示名称、修改日期、大小等信息;加上/b参数只显示文件名称列表,干净简洁;加上/a参数可以显示隐藏文件。我平时最常用的其实是dir /b,它的输出适合配合其他命令做批量操作。
举个例子,你想进入D盘并在D盘下新建一个java-work目录,然后查看里面的内容,完整流程是这样的:
D: mkdir java-work cd java-work dir这个组合覆盖了盘符切换、创建目录、切换目录、列出文件四个最核心操作,建议多敲几遍,形成肌肉记忆。
2.3 创建、复制、移动、删除:基础文件操作
在Windows图形界面里复制粘贴文件,人人都知道用Ctrl+C和Ctrl+V。但命令行下有它自己的几个命令,做批量操作时比鼠标快得多。
创建目录用mkdir(或简写md),它有一个很方便的特性:一次能创建多级目录。比如mkdir a\b\c会一次性把a、b、c三级目录全建出来,不需要一层层创建。
创建一个空的文本文件,可以用type nul > server.log。这条命令平时用来快速造一个占位文件。如果你想让文件里有内容,可以用echo写进去:
echo 你好 > readme.txt复制文件用copy,比如copy demo.txt D:\backup\demo.txt。它还支持通配符批量复制,后面会讲。如果要复制整个目录和里面的子目录,用xcopy更合适。
移动或重命名用move。比如move demo.txt D:\backup\会把文件移动过去;move old.txt new.txt则是在同一个目录下把文件改名。
删除文件用del,删除目录用rd。这两条命令要特别小心,因为命令行没有“回收站”的说法,del掉的文件无法在界面里找回。我个人的习惯是:在执行del或rd之前,先用dir确认一遍自己当前所在的目录和要删除的文件名,再做操作。尤其是rd /s /q这种加了一堆参数的删除,它会无声无息地把整个目录连内容一起清掉,一旦误操作代价很高。
2.4 相对路径、绝对路径与通配符
路径分两种。绝对路径是从盘符开始写的完整路径,比如D:\java-work\src;相对路径是以当前目录为基准的缩写路径,比如你在D:\java-work下,想操作src里的文件,直接写src\Hello.java就行,不需要再从盘符写起。
理解了相对路径和绝对路径,再看通配符就简单了。星号*表示匹配任意多个字符,问号?表示匹配任意单个字符。它们的组合用途非常广:
copy *.java D:\backup del *.tmp dir Test*.class第一条命令把当前目录下所有.java文件复制到D:\backup。第三条命令列出当前目录下所有以Test开头的.class文件。这个机制在批量处理文件时能省下大量时间,比如临时清理项目里的旧中间文件,一条del *.class就能搞定。
要注意的是,通配符默认只匹配当前目录的普通文件,不会递归到子目录里去找。如果你需要处理多级目录下的文件,还得配合后面要讲的for循环或者xcopy来用。
2.5 几个关键时刻能救急的小命令
有些命令平时用得不算多,但碰到特定场景时能救命。
- tree /f:以树状结构列出当前目录下所有子目录和文件。适合快速理清一个陌生项目的目录结构。
- cls:清空当前窗口的所有输出,让屏幕变干净。
- where java:用于查看某个命令实际指向的可执行文件路径。比如你装了多个JDK版本,where java能告诉你当前到底用的是哪一个。
- findstr:在文件内容里搜索字符串,类似文本编辑器里的查找功能。比如findstr "class" Hello.java会在源码里找出所有包含class字符的行。它在排查配置、搜索日志时非常有用。
我把这些命令整理成了一个小表,方便你贴在键盘旁边:
| 命令 | 作用 | 参考示例 |
|---|---|---|
| cd | 切换目录 | cd /d D:\java-work |
| dir | 列出文件 | dir /b |
| mkdir | 创建目录 | mkdir src |
| copy | 复制文件 | copy a.java b.java |
| xcopy | 复制目录 | xcopy src D:\backup /e |
| move | 移动或重命名 | move test.txt D:\test.txt |
| del | 删除文件 | del *.class |
| rd | 删除目录 | rd /s /q bulk |
| ren | 重命名文件 | ren old.java new.java |
| type | 查看文本文件内容 | type Hello.java |
| tree | 树状列出目录 | tree /f |
| findstr | 搜索文件内容 | findstr "main" Hello.java |
| where | 查找命令位置 | where java |
| cls | 清屏 | cls |
这个表覆盖了入门阶段的大部分需求,你在学习过程中如果遇到不认识的命令,直接在窗口里输入命令名加/?查看官方帮助,比如dir /?。这是所有命令的通用说明书。
3. Java入门实操:用DOS命令完成第一个Java程序
3.1 准备JDK并验证环境
写Java代码前,必须先装好JDK(Java Development Kit,Java开发工具包)。JDK里既包含编译工具javac,也包含运行工具java,还内置了一个完整的运行时环境。
下载安装建议去官方渠道寻找,选择LTS(长期支持)版本即可。安装的时候记住安装目录,后面配置环境变量要用。装完之后,先别急着写代码,打开命令窗口输入两条验证命令:
java -version javac -version如果能在屏幕上看到Java版本号,说明安装成功,环境变量也正确。如果看到“'javac' 不是内部或外部命令”的提示,也不用慌,这是环境变量的问题,解决办法在第四章详细讲。
一个容易踩的小坑是:有些人装了Java运行环境(JRE)就以为能开发了,但javac命令根本不存在。JRE只包含运行环境,不包含开发工具。你需要的完整JDK。
3.2 用命令建目录、写源码
打开命令窗口,我们从头开始一步步来。
首先建一个专门放练习代码的目录,建议放在D盘,路径简单好记。这里顺便把上一章的命令都用上:
D: mkdir java-work cd java-work接下来创建Java源文件。为了演示命令行操作,先用系统自带的记事本来创建文件:
notepad Hello.java系统会弹出记事本窗口,提示文件不存在并询问是否创建,选择“是”即可。然后输入下面的代码:
public class Hello { public static void main(String[] args) { System.out.println("Hello, Java!"); } }保存时注意两点。第一,文件名必须和public class后面的类名保持一致,这段代码里的类名是Hello,所以文件名必须是Hello.java。第二,建议在记事本的“另存为”窗口把编码改成UTF-8,这一点我在后面的编码问题小节还会详细解释。
3.3 编译:javac把源码翻译成字节码
写完代码回到命令窗口,确认当前目录在D:\java-work,然后输入:
javac Hello.java这条命令不会打印任何输出,也没有“编译成功”的提示。很多新手因此怀疑自己是不是敲错了,其实没有输出就是最好的结果。你可以用dir命令看一眼目录,会发现多了一个Hello.class文件,这就是编译出来的字节码。
如果代码有语法错误,javac会立刻输出错误信息并告诉你出错的行号。比如把语句末尾的分号去掉,编译时会提示“需要';'”。注意,编译错误和运行错误是两码事,编译都没过说明代码根本没法往下进行,需要先改源码。
这里再强调一下编译的含义。javac做的事情不是“让程序跑起来”,而是把人类能读懂的源码翻译成虚拟机能够识别的指令格式。你可以想象成把一份中文菜谱翻译成厨师能看懂的操作步骤,翻译完成之后,离上菜还差一步——按步骤执行。
3.4 运行:java命令与classpath
编译成功之后,用java命令运行:
java Hello注意,这里千万不要带.class后缀,也不能带.java后缀。java命令后面跟的是类名,不是文件名。如果你写成java Hello.class,系统会按类名去寻找Hello.class这个类,结果反而因为多了个.字符而报错。
运行成功后,屏幕会输出一行“Hello, Java!”。这是无数人第一次在命令行里让Java程序跑起来的历史性时刻。
接下来扩展一下,让程序能接收外部参数,这正好能帮你看懂main方法里的String[] args是什么东西。把Hello.java改成下面的内容:
public class Hello { public static void main(String[] args) { System.out.println("Hello, " + args[0]); } }重新编译,然后运行:
javac Hello.java java Hello 世界这次屏幕上会输出“Hello, 世界”。这里的“世界”是通过命令行参数传给程序的,java命令把参数包裹成一个字符串数组,交给main方法的args。数组的第一个元素就是args[0]。这个机制是所有命令行工具的基础,你以后执行任何带参数的程序,底层思路都是一样的。
如果运行时不带任何参数,代码里的args[0]就会导致数组越界,程序会崩,这也是一个很好的入门错误,值得亲手试一次。
3.5 进阶:使用-d和-classpath组织输出目录
默认情况下,javac生成的.class文件和.java源文件在同一个目录。项目简单时无所谓,但文件一多,目录会乱成一团。更规范的做法是把字节码单独放到一个输出目录。
先创建输出目录,然后编译:
mkdir out javac -d out Hello.java这里的-d选项告诉javac:把生成的class文件放到out目录。执行完可查看目录,会发现out\Hello.class。
此时再运行就不能直接写java Hello了,因为当前目录下已经没有Hello.class,虚拟机找不到类。需要手动告诉虚拟机去哪里找class文件,通过-classpath(简写为-cp)参数指定:
java -cp out Hello-classpath这个参数的翻译是“类路径”,它指定了虚拟机搜索class文件的目录。如果不写,默认是当前目录。这也是之前直接写java Hello能成功的原因。理解classpath是Java学习中一个重要的分水岭,后面引入第三方依赖包时,你会频繁和它打交道。
一个提醒:有些教程让你去配一个叫CLASSPATH的环境变量,把当前目录和各类jar包都塞进去。在JDK9以上的版本里,这种做法已经不太推荐了,反而容易掩盖问题。我的建议是保持简单,运行时用-cp命令显式指定,写清楚依赖来源,比靠环境变量“魔法”靠谱得多。
4. 编译运行中的常见报错与排查
4.1 “javac不是内部或外部命令”怎么解决
安装完JDK后敲javac没反应,这是新手遇到最多的问题,没有之一。
原因很简单:操作系统在环境变量PATH指定的目录里找不到javac命令。当你输入一个命令时,系统会逐一遍历PATH里的目录,看能不能找到对应名称的程序。如果找不到,就会提示“不是内部或外部命令”。
解决办法是把JDK的bin目录加入PATH。假设你的JDK安装在C:\Program Files\Java\jdk-17(以实际安装路径为准),那么bin目录的完整路径就是C:\Program Files\Java\jdk-17\bin。
操作步骤:
- 右键“此电脑”选“属性”,打开“高级系统设置”。
- 点击“环境变量”,在“系统变量”里找到Path。
- 编辑Path,新增一行,填入JDK的bin目录路径。
- 确定保存后,重新打开一个命令窗口。
注意第四点很关键:修改环境变量之后,已经打开的命令窗口不会自动生效,必须新开一个。
另外建议顺手配一个JAVA_HOME变量,值填JDK的安装根目录。虽然现在不配也能用,但很多后续工具会读取这个变量,早点配上省得以后到处找。
4.2 “找不到或无法加载主类”的三类原因
运行提示“错误: 找不到或无法加载主类 Hello”,这是编译通过后最容易遇见的坎。导致这个问题的原因,通常逃不出下面三种。
第一,类名拼写错误或大小写不匹配。Java严格区分大小写,public class Hello对应java Hello;如果你敲成java hello,哪怕文件名叫Hello.java,系统也找不到。
第二,java命令带了.class后缀。写成java Hello.class是常见手误,去掉.class即可。
第三,class文件不在当前搜索路径里。比如前面用javac -d out编译,class文件在out目录,但你还直接执行java Hello,当前目录没有Hello.class,自然报错。这时要么回到class文件所在目录,要么用-cp指定类路径。
排查顺序建议固定下来:先用dir确认Hello.class到底存在不存在、在哪个目录;再检查java后面的类名是否与类名完全一致;最后检查有没有用到-cp参数。这套顺序能覆盖绝大多数情况。
4.3 编译报错却看不出语法问题:多半是编码
如果你在源码里写了中文,比如中文字符串或者中文注释,编译时可能会遇到“非法字符”“需要';'”这类奇怪报错,而且报错位置看起来毫无逻辑。
这是编码不一致导致的。你的源码文件在保存时是一种编码,javac读取时却用了另一种编码规则,两边对不上,中文符号被解释成乱码,javac自然就“看不懂”了。
在简体中文Windows环境里,记事本默认保存的可能是系统自动选择的ANSI编码,实际即GBK;而不少现代编辑器默认保存为UTF-8。javac如果没有特别指定,又会使用系统默认编码。三者的不一致是混乱的根源。
最稳妥的组合是:源文件统一保存为UTF-8,编译时显式告诉javac编码方式:
javac -encoding UTF-8 Hello.java如果你的编辑器保存的是带BOM的UTF-8,那也会出问题。BOM是一串隐藏字符,javac读到它时会报“非法字符:'\ufeff'”。这时需要在编辑器里改成“UTF-8无BOM”格式保存。这也是我建议你换用一款主流现代文本编辑器来写代码的原因,这类细节在记事本里非常容易踩坑。
4.4 控制台输出中文乱码之类的问题
代码本身没有任何错误,编译也过了,但运行时中文输出变成了乱码,这是运行时的编码问题,和编译错误不同。
原因在于Windows控制台的默认代码页通常是936(即GBK),而源码被编译成UTF-8的字符串常量后,程序输出了UTF-8字节序列,控制台却用GBK来解释,于是中文变成了“锟斤拷”之类的乱码。
最简单的临时解决方法是切换当前控制台的代码页:
chcp 65001执行后再运行java程序,乱码通常就消失了。不过这种方式只在当前窗口有效,关掉再开就又回到原来状态。如果你觉得每次都要敲一句很麻烦,可以写进后面要讲的批处理脚本里。
4.5 编译报错速查表
平时带新人时,我把新手最常遇到的几条报错信息整理成了一个速查表,遇到问题直接对号入座:
| 报错信息 | 可能原因 | 解决方向 |
|---|---|---|
| 'javac' 不是内部或外部命令 | PATH未包含JDK的bin目录 | 配置环境变量并重开窗口 |
| 错误: 找不到或无法加载主类 | 类名拼错/带后缀/class不在路径 | 按 4.2 三步排查 |
| 需要';' | 漏了分号或中文符号 | 检查对应行号,切换英文输入法 |
| 非法字符 | 编码不一致 | 统一UTF-8并加-encoding参数 |
| 类Hello是公共的,应在名为Hello.java的文件中声明 | 文件名与类名不一致 | 重命名文件或类 |
| 程序包xxx不存在 | 缺少依赖包 | 检查classpath是否完整 |
这张表不是让你背的,而是希望你在遇到问题时养成一个习惯:先完整读一遍报错,找到关键词,再去网上搜,而不是把整个错误信息一股脑截图丢给其他人。
5. 进阶:用DOS批处理搭建顺手的学习环境
5.1 为什么需要批处理脚本
前面所有的命令,每次写代码都要重复敲一遍。创建目录、切换目录、编译、运行,这套流程一两次还能接受,十次八次之后就开始烦了。
批处理脚本就是来解决这个问题的。它相当于把一串DOS命令写进一个文本文件,双击或输入文件名就能依次执行,省去逐条输入的麻烦。Windows下这种脚本的后缀是.bat。
有人可能会问:直接上图形化开发工具不就好了吗?但批处理和图形化工具是两码事。批处理脚本能让你把命令行操作固化成一套工作流,每次运行都看得到中间过程,仍然保持着对编译运行细节的感知。而且这套思路以后写自动化脚本、写CI流程时完全相通。
5.2 一键编译运行:写一个run.bat
在D:\java-work目录下新建run.bat,内容如下:
@echo off cd /d D:\java-work javac -encoding UTF-8 Hello.java if errorlevel 1 ( echo 编译失败,请检查代码 pause exit /b ) java Hello pause拆开讲解一下。
@echo off表示不在窗口里重复显示命令本身,让输出更干净。
cd /d D:\java-work是切换工作目录,保证后续命令都在正确位置执行。
javac -encoding UTF-8 Hello.java是编译命令,固定用UTF-8编码,解决前面说的中文问题。
if errorlevel 1是退出码判断。当javac执行失败时,它会返回一个非零的退出码,errorlevel 1表示“退出码大于等于1”,说明编译出错。这时脚本会提示编译失败并暂停,避免继续运行一个不存在的程序。
java Hello是运行命令。
pause的作用是让窗口在执行完之后停留,方便你查看输出。如果直接双击脚本,没有pause的话窗口会一闪而过,什么都看不清。
下一步可以改进这个脚本,让它能接收参数,适配任意类名:
@echo off set SRC=%1 if "%SRC%"=="" ( echo 请指定类名,例如 run.bat Hello exit /b ) cd /d %~dp0 javac -encoding UTF-8 %SRC%.java if errorlevel 1 ( echo 编译失败 pause exit /b ) java %SRC% pause这里的set SRC=%1表示把第一个命令行参数赋值给变量SRC。%~dp0是一个特殊占位符,代表脚本本身所在的目录,这样不管你从哪里运行脚本,它都会先切回自己所在的目录,避免路径混乱。
以后你写了新类名,比如写了一个World.java,直接运行:
run.bat World脚本就会自动编译并运行World类,非常顺手。
5.3 批量编译与for循环
如果你在一个目录下写了多个Java源文件,希望一次性全部编译,可以在命令行里用for循环。在Windows命令行实际使用时,写作单百分号:
for %f in (*.java) do javac -encoding UTF-8 %f这条命令会遍历当前目录下所有.java文件,逐个交给javac编译。如果要把这段代码写进批处理脚本,则需要把%f改成%%f:
for %%f in (*.java) do javac -encoding UTF-8 %%f原因是在批处理脚本里,单个%会被当成特殊的变量前缀,所以循环变量需要写成两个百分号。这个小细节经常让新手困惑,但其实记住一条就行:命令行手敲用单%,写进.bat文件用双%。
这种批量编译方式适合练习阶段快速验证多个小文件。等以后项目真正复杂起来,会有更专业的构建工具来管理依赖和编译顺序,但理解“批量编译”这个概念本身仍然有价值。
5.4 给新手的刻意练习清单
掌握了前面这些内容,你已经有能力在纯DOS环境下完成Java程序的开发闭环。但“知道”和“熟练”之间还差着大量练习。我建议你按下面的清单练一遍,每项都刻意要求自己只用命令行完成,不打开图形界面。
练习一:用命令建一套练习目录,比如D:\java-practice,下面再分src和out两个子目录,然后用dir和tree检查结果。目的是把目录操作练成肌肉记忆。
练习二:写一个程序,接收两个命令行参数,把它们相加后输出。要求分别测试正确参数、缺少参数、参数为负数三种情况,观察程序行为。这个练习能帮你理解参数数组和类型转换。
练习三:故意制造编码错误,先故意用GBK保存带中文的源码,然后用UTF-8编码去编译,观察报错;再改成-encoding参数后编译运行,感受编码参数的作用。
练习四:改造run.bat,让它能在编译前自动创建out目录,并利用-cp参数把class文件运行起来。这一步能帮你把前几章的内容串成一条完整的链。
如果你把这些练习都做完,你的DOS命令基本功和Java入门的底子就已经搭建起来了。之后再接触图形化开发工具,或者直接去看别人的项目代码,都会轻松很多。
我带过不少刚开始学Java的朋友,一个很明显的规律是:凡是愿意先在DOS窗口里老老实实敲命令、看报错的人,后面遇到环境问题、部署问题,心态都稳很多。他们不会一看见黑窗口就慌,脑子里有一条清楚的链路:源码在哪、编译产物在哪、运行时依赖什么。反观那些一路只依赖图形界面的人,往往第一次接触服务器就卡在第一步。所以如果你刚开始学Java,别嫌DOS窗口枯燥,这些命令每个都值得亲手敲一遍,敲错了就看看报错,报错就是最好的老师。等哪天你发现自己能不看任何提示,一口气完成建目录、写代码、编译、运行、传参数一整套动作,恭喜,你已经有了一点“程序员的手感”。