用 mvn archetype:generate 生成标准结构最直接,需指定 -DarchetypeArtifactId(如 maven-archetype-quickstart),确保 src/main/java 等路径自动创建;包路径必须与 groupId 对齐(如 com.example → com/example/),resources 文件按类路径加载,IDE 导入后须手动标记源码根目录。

用 mvn archetype:generate 快速生成标准结构
最直接的方式不是手动建文件夹,而是用 Maven 内置原型命令。执行以下命令后按提示选 maven-archetype-quickstart(对应 Java 项目)或 maven-archetype-webapp(Web 项目):
mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -Dversion=1.0.0 -DarchetypeArtifactId=maven-archetype-quickstart
生成后你会得到符合 Maven 约定的目录树,src/main/java、src/test/java 等路径自动创建,无需手敲。
注意:别跳过 -DarchetypeArtifactId 参数,否则可能拉取默认的旧版原型,导致 src/main/resources 缺失或 pom.xml 没配好编译插件。
src/main/java 和 src/test/java 的包路径必须严格对齐
Maven 不靠文件夹名识别源码,而是依赖 groupId + artifactId 推导默认包根路径。比如 groupId 是 com.example,那么 src/main/java 下必须从 com/example/... 开始放类,否则 mvn compile 会报 package does not exist。
立即学习“Java免费学习笔记(深入)”;
- 错误示例:
src/main/java/MyService.java—— 编译失败,Maven 找不到该类的所属包 - 正确写法:
src/main/java/com/example/MyService.java,且文件内声明package com.example; - 测试类同理:
src/test/java/com/example/MyServiceTest.java,包名和主代码一致
resources 目录不参与编译但会被打包,路径需与代码包结构配合
src/main/resources 下的文件(如 application.properties、logback.xml)在构建时原样复制到 target/classes/,和 class 文件平级。这意味着如果在代码中用 Class.getResource("/config/db.conf") 加载,实际查找路径是 target/classes/config/db.conf。
常见踩坑点:
- 把配置文件放在
src/main/resources/com/example/下,却用getResource("db.conf")—— 缺少前导/导致相对路径查找失败 - 误将
.java文件放进resources目录 —— 不会被编译,也不会报错,但运行时ClassNotFoundException -
src/test/resources只在测试阶段生效,生产打包时不会包含其中内容
IDE 导入后仍需检查是否识别为 Maven 项目
IntelliJ 或 Eclipse 导入项目时,即使有 pom.xml,也可能只当普通文件夹处理,导致 src/main/java 不被识别为 Sources Root,src/test/java 不是 Test Sources Root。
验证方式:
- 在 IntelliJ 中右键
src/main/java→ “Mark as Sources Root”,确认图标变成蓝色文件夹 - 执行
mvn clean compile后检查target/classes/是否生成了对应 class 文件 - 若 IDE 提示 “Cannot resolve symbol” 且命令行编译正常,大概率是 IDE 没刷新 Maven 项目(IntelliJ 点右上角 Maven 工具栏的刷新按钮;Eclipse 右键项目 → “Maven” → “Update Project”)
真正容易被忽略的是:Maven 的目录约定是硬性约束,不是建议。一旦路径或包名错位,mvn test 可能静默跳过测试类,或者 mvn package 打出的 jar 里缺资源——这些都不会报明显错误,只会让运行时崩得莫名其妙。










