用Maven生成比手动创建更可靠,因其archetype:generate自动创建src/main/java、src/main/resources、src/test/java等标准目录并预置pom.xml;手动易错如漏main层级、resources位置错误或test目录未标记为测试源根。

Java标准项目目录结构不是由Java语言本身规定的,而是由构建工具(如Maven或Gradle)约定的,直接手建容易漏掉关键目录或破坏工具识别逻辑。
为什么用Maven生成比手动创建更可靠
Maven的archetype:generate会自动创建符合src/main/java、src/main/resources、src/test/java等规范的层级,并预置pom.xml和基础依赖。手动创建时常见错误包括:src/java(少main/)、resources放在src/main/同级(被忽略)、test目录未设为测试源根(IDE不识别测试类)。
- 执行
mvn archetype:generate -DgroupId=com.example -DartifactId=myapp -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false即可生成标准骨架 - 若用IDEA,新建项目时选“Maven”,勾选“Create from archetype”,选
maven-archetype-quickstart,比手动建目录快且零出错 - Gradle用户应运行
gradle init --type java-application,它会生成src/main/java和src/test/java,但默认不含resources目录,需手动补上src/main/resources
src/main/java和src/main/resources的分工必须明确
Java类文件只能放src/main/java下,且包路径必须与目录结构严格一致(如com.example.App必须在src/main/java/com/example/App.java);而src/main/resources专用于非编译型资源——application.properties、logback.xml、SQL脚本、静态配置JSON等。混淆会导致运行时报FileNotFoundException或NullPointerException(因Class.getResource()找不到路径)。
-
src/main/java/com/example/config/DbConfig.java→ 编译后生成DbConfig.class,放在classes/com/example/config/ -
src/main/resources/application.yml→ 直接复制到classes/根目录,可被ClassLoader.getSystemResource("application.yml")加载 - 切勿把
.properties放进java目录——编译器会尝试编译它,报error: invalid flag
测试目录src/test/的结构和依赖范围易被忽略
src/test/java必须与主代码包结构一致(如主代码在com.example.service.UserService,测试类就该在src/test/java/com/example/service/UserServiceTest.java),否则@Test方法无法被发现;更重要的是,src/test/resources中的配置(如test-application.properties)仅在测试阶段生效,不会打进最终jar包——这是隔离测试环境的关键机制。
立即学习“Java免费学习笔记(深入)”;
- Maven中
test范围的依赖(如junit、mockito-core)不会出现在mvn dependency:tree的运行时依赖列表里 - 若在
src/test/resources里放了logback-test.xml,它会优先于src/main/resources/logback.xml被加载,适合调试测试日志级别 - IntelliJ中右键
src/test目录 → “Mark Directory as” → “Test Sources Root”,否则@Test注解不生效
真正麻烦的不是目录名写错,而是资源路径硬编码成"./config/app.conf"这类相对路径——它在IDE里可能跑通,一打包成jar就失效。所有资源加载都该走Class.getResource()或ClassLoader.getResource(),依赖构建工具定义的classpath规则。










