每次帮新人排查环境问题,十有八九都卡在Java和Maven的安装配置上。明明下载好了、装上了,一跑命令就报“不是内部或外部命令”,或者IDEA里新建项目直接飘红,依赖怎么也拉不下来。这些问题的根源,往往不是版本选错,就是环境变量没配明白,再不然就是Maven的配置文件压根没动过。
这篇内容我就把Java和Maven从下载、安装、配置到IDEA联调的全过程捋一遍。我会直接给出一套经过大量实践验证的配置方案,包括JDK版本怎么选、Maven的settings.xml到底该怎么改、阿里云镜像和本地仓库怎么配,以及那些高频报错(比如maven artifact 'com.mysql:mysql-connector-j:release' cannot be resolved)的排查思路。适合刚入门Java的初学者,也适合被环境问题反复折腾的开发同学。
1. 先把Java和Maven的关系捋清楚
1.1 Java不是装上就能直接用的
Java程序的运行依赖JRE(Java运行时环境),而开发Java程序需要JDK(Java开发工具包)。JDK里包含了JRE,还额外提供了编译器(javac)、调试器、打包工具等,所以日常开发必须装JDK。
很多人会把“安装Java”理解成“双击安装包,下一步到完成”。装完之后在命令行敲java -version,哎,有输出。但新建项目、写代码、用Maven编译的时候就各种报错,为什么?因为JDK装了,但操作系统的PATH环境变量里没有指向它,系统根本找不到javac在哪里。命令行认识java,是因为安装程序自动帮你配了部分路径,但这套自动配置经常不完整。
1.2 Maven到底在干什么
Maven是一个项目管理与构建工具,核心职责有三块:依赖管理、项目构建、项目信息管理。
依赖管理解决的是“下载jar包”的问题。以前开发Java Web项目,需要手动去各个网站找jar包,下载后复制到WEB-INF/lib目录,版本冲突、缺少传递依赖是家常便饭。Maven通过pom.xml文件声明依赖,构建时自动去中央仓库下载,并处理传递性依赖,把jar包统一存放在本地仓库(本地机器上的一个目录)里。
项目构建解决的是一套固定的构建流程:编译源码、执行单元测试、打包成jar或war、部署到服务器。Maven定义了标准的生命周期,mvn clean、mvn compile、mvn test、mvn package这些命令在项目里执行起来非常统一。
Maven的项目结构也有约定。标准Maven项目的源码目录长这样:
项目根目录 ├── pom.xml └── src ├── main │ ├── java # 主代码 │ └── resources # 配置文件 └── test ├── java # 测试代码 └── resources # 测试资源这种约定优于配置的思想,让不同开发者之间协作时的项目结构保持一致,接手成本低很多。
1.3 版本选择的关键逻辑
JDK的版本选择,我直接给结论:如果你是初学者或做一般业务开发,装JDK 8(即1.8)或者JDK 11、JDK 17都可以,但更推荐从JDK 8开始学起。
原因有两点:
- 大量企业级老项目仍然运行在JDK 8上,面试和工作中大概率会遇到。
- JDK 8的学习资料最丰富,遇到问题搜索解决方案最容易。
Java 8之后是Java 11(LTS版本)、Java 17(LTS版本)。如果你是新起项目,没有历史包袱,直接JDK 17也没问题。但要注意Maven的版本需要能支持对应的JDK,太老的Maven版本解析不了新JDK编译的字节码。
Maven版本同理,不要盲目追求最新,主流稳定的Maven 3.6.x、3.8.x版本就足够日常使用。3.9.x也已经很稳定了,可以选用。关键是在官网下载apache-maven-3.x.x-bin.zip这个二进制包,不要下Source包。
2. JDK安装与环境变量配置全程记录
2.1 JDK下载与安装
去Oracle官网或者Adoptium(Eclipse Temurin)下载JDK。国内访问Oracle官网速度一般,Adoptium(https://adoptium.net)是个好选择,下载速度快,而且提供了OpenJDK的正式构建版。
选择Windows x64 Installer(.msi格式)或zip包都可以,推荐msi安装包,一路Next就能装好。安装目录建议统一放在纯英文路径下,比如:
D:\Java\jdk-8或者
D:\Java\jdk-17安装路径不要出现中文、空格、特殊符号。虽然现在很多工具能容忍带空格的路径,但后续排查问题时每多一个变量都可能是坑,所以从一开始就避免最省事。
2.2 环境变量配置:三个变量一次配齐
右键“此电脑” → 属性 → 高级系统设置 → 环境变量。
在“系统变量”区域,我们要操作三个变量。
第一个变量:JAVA_HOME
新建系统变量,变量名JAVA_HOME,变量值填JDK安装路径,比如:
D:\Java\jdk-8这个变量本身不会被Java直接使用,但它是一个“中间桥梁”。后面配置PATH和其他的工具(Tomcat、IDEA、Maven等)都会引用%JAVA_HOME%。好处是以后升级JDK版本,只需要改JAVA_HOME这一个变量值,其它引用处自动生效。
第二个变量:PATH
找到系统变量里的Path变量,双击编辑,新增两行:
%JAVA_HOME%\bin %JAVA_HOME%\jre\binWindows是使用分号(;)分隔多个路径的,但Windows 10以上的系统在编辑环境变量的界面里,可以直接一行一个路径来添加,不用手动输入分号,更直观不易出错。
bin目录里放着java.exe、javac.exe等可执行程序,只有把bin目录加入PATH,命令行才能找到这些命令。
提示:JDK 8及之前的版本自带JRE目录,新增
%JAVA_HOME%\jre\bin没问题。JDK 11及之后的版本,安装时默认可选JRE,而且不再有独立的jre目录,所以第二行可以不需要。直接用%JAVA_HOME%\bin就够了。
第三个变量:CLASSPATH
这是一个容易产生争议的变量。以前配置Java环境变量时,都会加一个CLASSPATH,变量值为:
.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar但JDK 1.5之后,Java编译器已经能自动搜索并加载相关类,不再强制需求CLASSPATH。我在用自己的电脑新装JDK时,只配JAVA_HOME和PATH,不配CLASSPATH,编译运行都正常。
如果你是照着很多老教程走,配了CLASSPATH,只要路径正确问题也不大。但要注意最前面的.,它代表当前目录。如果手抖漏掉这个点,或者路径里的dt.jar、tools.jar不存在(高版本JDK里没有这些jar),反而会带来一些莫名其妙的类加载问题。我个人的建议是:新配置环境时直接用“不配CLASSPATH”的方案,简单干净。
2.3 验证安装是否成功
配置完成后,最重要的是验证。重新打开一个命令行窗口(注意,必须重新打开,否则不会加载最新环境变量),依次输入:
java -versionjavac -version有类似下面的输出,说明JDK安装成功:
java version "1.8.0_202" Java(TM) SE Runtime Environment (build 1.8.0_202-b08) Java HotSpot(TM) 64-Bit Server VM (build 25.202-b08, mixed mode)以及:
javac 1.8.0_202注意,java命令能识别不代表javac能识别。有时候有人只验证了java -version,以为配置好了,结果一执行mvn compile就报javac找不到,其实就是JDK的bin目录没有完全配置对。
3. Maven下载安装与配置文件落地
3.1 Maven下载与安装
Maven官网(https://maven.apache.org)的Download页面,找到“Binary zip archive”下载链接,比如:
apache-maven-3.8.8-bin.zip下载zip包,解压到纯英文路径,比如:
D:\Maven\apache-maven-3.8.8Maven是免安装的绿色软件,解压即用。解压完成后,目录结构里需要注意两个地方:
bin目录:包含mvn.cmd命令conf/settings.xml:全局配置文件,这是Maven配置的核心
3.2 Maven环境变量配置
跟JDK一样,配置两个系统变量。
新建MAVEN_HOME变量:
D:\Maven\apache-maven-3.8.8在Path变量中新增:
%MAVEN_HOME%\bin验证Maven安装:
mvn -v如果输出类似以下内容,说明Maven已就绪:
Apache Maven 3.8.8 (dd04b20f45b1a6b8a1c1e3b7a7f2e1a2b3c4d5e6f) Maven home: D:\Maven\apache-maven-3.8.8 Java version: 1.8.0_202, vendor: Oracle Corporation Java home: D:\Java\jdk-8注意输出里的Java version和Java home。Maven会在运行时根据JAVA_HOME环境变量定位JDK,如果这里显示的不是你期望的JDK版本,需要回头检查JAVA_HOME是否配置正确,或者是否被系统里其它位置的Java干扰了。
3.3 settings.xml到底该改什么
conf/settings.xml是全局配置文件,它决定了Maven的本地仓库位置、远程仓库镜像、认证信息、代理等。Maven在运行时会读取这个文件,但它的配置优先级低于用户级别的~/.m2/settings.xml。
如果没有用户级settings.xml,Maven才会使用conf目录下的全局配置。我一般建议直接修改conf/settings.xml,因为更直观;或者在用户目录下创建.m2/settings.xml,把配置都放在用户级别,这样即使Maven升级、覆盖安装,也不会丢失个人配置。
下面把settings.xml里比较关键的配置拆开讲。
4. 本地仓库和阿里云镜像配置
4.1 本地仓库路径
Maven默认的本地仓库位置是当前用户目录下的.m2/repository,比如C:\Users\你的用户名\.m2\repository。
问题在于,C盘空间宝贵,而且如果系统重装、用户目录被清理,本地仓库里的几百上千个jar包就全没了,下次还要重新下载。更隐蔽的影响是:有些公司电脑的C盘剩余空间有限,默认仓库路径下jar包缓存越来越大,导致磁盘告警。
推荐把本地仓库改到独立位置,比如D盘。打开settings.xml,找到被注释掉的localRepository标签附近,取消注释并修改:
<localRepository>D:\Maven\repository</localRepository>这个路径就是以后所有Maven依赖jar包存放的位置。设好之后可以在第一次构建项目时观察这个目录,jar包会按坐标(groupId、artifactId、version)路径一层层地创建出来。
4.2 阿里云镜像配置详解
默认情况下,Maven从中央仓库(repo.maven.apache.org)下载依赖。在国内网络环境下,这个过程不稳定且速度慢,经常下载到一半就超时失败。
阿里云提供了一个Maven中央仓库的镜像,配置之后下载速度和稳定性会明显提升。在settings.xml里的<mirrors>标签内添加:
<mirror> <id>aliyun</id> <name>aliyun maven</name> <url>https://maven.aliyun.com/repository/public</url> <mirrorOf>*</mirrorOf> </mirror>mirrorOf填*表示所有远程仓库的请求都走这个镜像,包括你项目里自定义配置的其它repository。这样做的好处是“一把梭”,各种依赖都从阿里云走;坏处是如果你的项目需要访问一个内网私服(比如公司内部Nexus),把私服请求也强制走阿里云,就会导致依赖拉取失败。
如果公司里有Nexus私服,mirrorOf需要写成特定的仓库id白名单,比如:
<mirrorOf>*,!nexus</mirrorOf>表示除nexus这个仓库id以外,其它都走阿里云。这个细节工作中很常见,配置时注意一下就行。
阿里云的public仓库包含了central和jcenter的快照,一般业务开发用public就足够了。如果依赖涉及spring相关的里程碑版本,有时还需要单独配置spring的镜像:https://maven.aliyun.com/repository/spring。
4.3 配置JDK编译级别
在settings.xml中,还有一个我每次都会改的地方:<profiles>标签内配置JDK版本。Maven默认的编译目标版本比较保守,如果不显式指定,经常出现“用了lambda表达式但编译报错”这类问题。
在<profiles>节点里加上这样的profile:
<profile> <id>jdk-1.8</id> <activation> <activeByDefault>true</activeByDefault> <jdk>1.8</jdk> </activation> <properties> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion> </properties> </profile>如果你用JDK 17,就把1.8替换成17。这样在pom.xml里没有显式配置maven-compiler-plugin编译版本时,Maven也会使用对应的JDK语言级别来编译,减少很多编译期报错。
4.4 IDEA配置默认仓库
这一步虽然叫“默认仓库”,实际上是给IDEA绑定Maven。IDEA内置了一个Maven,但内置的版本不一定适合所有项目,而且它的配置文件路径和我们自己配置的settings.xml不同,行为不一致会导致一些诡异问题。
强烈建议在IDEA里明确指定自己安装的那个Maven。打开IDEA:
- File → Settings → Build, Execution, Deployment → Build Tools → Maven
- Maven home path:选择D:\Maven\apache-maven-3.8.8
- User settings file:选择对应settings.xml
- Local repository:会自动读取settings.xml中配置的路径
设置完成后,IDEA里新建或导入的Maven项目都会使用这一套配置。
5. 在IDEA里新建Maven项目并验证全链路
5.1 新建Maven项目操作步骤
在IDEA中新建Maven项目,这一步被搜索引擎搜了很多次,我直接把它写成步骤清单。
- File → New → Project。
- 左侧选择Maven,注意不要选Maven Archetype里的webapp模板,除非你需要的是传统war包项目。一般选择“Maven”即可。
- Project SDK选择你安装的JDK版本。
- 点击Next,填写GroupId和ArtifactId,GroupId一般写公司域名反写,比如
com.example;ArtifactId写项目名。 - 点击Finish,等待IDEA自动导入Maven项目。
新建完成后,项目结构里会自动生成pom.xml和src/main/java目录。此时IDEA会执行Maven的依赖解析,窗口右下角会有一个进度条显示依赖下载情况。
首次新建项目时,因为本地仓库还是空的,需要下载Maven自身的基础插件(包括compiler插件、surefire插件等),这个过程会花几分钟。这些插件也遵循镜像配置,所以阿里云镜像快不快,这里体会最深。
5.2 pom.xml里加一个依赖验证拉取
为了验证Maven的本地仓库、镜像配置是否生效,可以在pom.xml的<dependencies>标签里加一个最常见的依赖:
<dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> </dependency>保存之后,IDEA会自动解析这个依赖。如果本地仓库里没有,Maven会去推送的那个镜像仓库下载。等下载完成后,展开IDEA右侧的Maven窗口,在Dependencies里能看到mysql-connector-j:8.0.33,说明整个链路已经打通。
5.3 命令行方式验证Maven构建
很多习惯命令行的同学会直接用mvn命令构建项目,这是检验Maven配置是否完整的最佳方式。
在项目根目录(必须有pom.xml)打开命令行,执行:
mvn clean compileclean会删除target目录,compile会执行编译流程。如果输出里有BUILD SUCCESS,说明JDK和Maven的配合没有问题。
这个命令其实触发了一整套Maven生命周期:validate、initialize、generate-sources、process-sources、compile等。初次执行时Maven会下载大量插件,等有了缓存之后,构建速度会快很多。
6. 常见问题与排查思路
6.1mvn不是内部或外部命令
同时运行mvn -v和java -version,先确认JDK正常。如果java正常而mvn异常,说明MAVEN_HOME或PATH里的%MAVEN_HOME%\bin配置有问题,检查这两个变量。
还有一个隐蔽原因:如果系统里同时存在C盘的Maven和D盘的Maven,PATH里的顺序会影响实际生效的是哪个。可以通过where mvn查看系统解析到的Maven路径,确认是不是自己配置的那个。
6.2 Maven下载依赖超时或失败
如果配置了阿里云镜像还是超时,优先检查settings.xml是否被正确加载。在命令行执行:
mvn help:effective-settings这个命令会输出当前生效的settings.xml内容,可以确认mirror是否真的生效。如果localRepository或是镜像配置没生效,问题一般出在“改了settings.xml但改错文件”或者“IDEA里指向了另外一份settings.xml”。
6.3 IDEA里依赖报红:cannot be resolved
报错信息类似:
maven artifact 'com.mysql:mysql-connector-j:release' cannot be resolved这种报错通常有三个原因:
第一个原因:版本号不存在。比如<version>release</version>这种写法,Maven无法解析名为release的具体版本,因为中央仓库(或镜像仓库)里没有这个版本号。正确做法是使用明确版本号,比如8.0.33、5.1.49。
第二个原因:仓库里没有这个依赖或依赖被仓库策略拦截。阿里云镜像的public仓库会同步中央仓库,一般不会缺依赖。但如果用的是类似https://maven.aliyun.com/repository/central这个单独仓库,某些依赖的快照版本可能没有被同步。可以切换成https://maven.aliyun.com/repository/public再试。
第三个原因:本地仓库里有损坏的缓存文件。这时手动删除本地仓库里对应依赖的目录,然后让Maven重新下载,通常~/.m2/repository/com/mysql/mysql-connector-j整个删掉再重新解析就行。也可以用IDEA的“Reload All Maven Projects”按钮触发重新解析。
6.4 IDEA编译报错:java: 无效的目标发行版
这个报错说明当前项目要求的Java版本和IDEA使用的JDK不匹配。检查三个地方:Project Structure里的Project SDK、Modules里的Language level、Maven的maven.compiler.source/target配置。这三处必须保持一致。
6.5 修改settings.xml后IDEA不生效
IDEA缓存会导致配置更新不及时。点击Maven窗口里的刷新按钮,或者选择重新导入项目。极端情况下,可以File → Invalidate Caches,清掉IDEA缓存后重启。
7. 一套配置走天下的完整清单
按照惯例,最后给一份可直接照抄的配置清单。这份清单覆盖了JDK 8 + Maven 3.8.x的Windows环境,也是我日常配置新电脑时完整执行一遍的清单。
JDK部分:
- 下载安装JDK 8(推荐Adoptium或Oracle),记住安装路径:
D:\Java\jdk-8 - 系统变量新增
JAVA_HOME,值为D:\Java\jdk-8 - PATH里新增两行:
%JAVA_HOME%\bin - 重新打开命令行,执行
java -version和javac -version验证
Maven部分:
- 下载apache-maven-3.8.8-bin.zip,解压到
D:\Maven\apache-maven-3.8.8 - 系统变量新增
MAVEN_HOME,值为D:\Maven\apache-maven-3.8.8 - PATH里新增
%MAVEN_HOME%\bin - 编辑
conf/settings.xml,修改localRepository为D:\Maven\repository - 在
<mirrors>里添加阿里云public镜像 - 在
<profiles>里添加jdk-1.8的profile - 执行
mvn -v验证
IDEA部分:
- Settings → Maven:指定Maven home为
D:\Maven\apache-maven-3.8.8 - 指定User settings file为配置好的settings.xml
- File → New → Project → 选Maven,指定JDK版本
- 在pom.xml里添加依赖,验证依赖下载
这个流程我重复过很多次,各种版本的组合也都试过。基本上照着这个顺序走,一次配好之后,后面新建多少个项目都不会再为环境问题头疼。如果遇到没覆盖到的报错,记住两个万能动作:先看mvn help:effective-settings确认配置有没有生效,再删掉本地仓库里对应依赖的缓存让Maven重新下载。大部分问题都能用这两招解决。