java项目标准目录结构由maven约定确立,核心为:src/main/java存源码、src/main/resources存配置资源、src/test/java存测试代码;该结构被jdk工具链和ide广泛默认支持,不遵循将导致编译或运行时类/资源加载失败。

Java项目标准目录结构怎么定
OpenJDK 本身不规定项目目录结构,它只提供编译器(javac)和运行时(java);真正决定目录怎么组织的是构建工具或 IDE 的约定。但 Java 社区长期形成了一套事实标准,叫「Maven 标准目录布局」,几乎所有现代 Java 项目(无论用不用 Maven)都默认照搬这套结构,因为 javac 和 IDE 都认它。
核心就三点:源码放 src/main/java,资源放 src/main/resources,测试代码放 src/test/java。没这三层,javac 能编译,但 IDE 可能不识别包路径,java -cp 运行时容易找不到类或配置文件。
手动建目录时最容易漏掉的三个位置
很多人用记事本写完 HelloWorld.java 就直接扔进桌面,然后 javac HelloWorld.java 成功,但一跑 java HelloWorld 就报 NoClassDefFoundError —— 其实只是没按包结构放文件。
-
src/main/java:必须存在,且 Java 源文件要严格按包名嵌套,比如package com.example;就得放在src/main/java/com/example/HelloWorld.java -
src/main/resources:哪怕暂时没配置文件,也建议提前建好。否则读log4j2.xml或application.properties时,ClassLoader.getResource()会静默失败 -
out或target/classes:编译输出目录不能和源码混在一起。用javac -d out src/main/java/com/example/HelloWorld.java显式指定输出位置,避免 .class 文件散落难清理
用 javac 编译时 classpath 怎么设才不翻车
不依赖 Maven 时,javac 对目录结构很敏感。常见错误是:源码在 src/ 下,却从 src/ 目录里执行 javac *.java —— 这会导致生成的 .class 文件没按包路径存放,后续 java 命令根本加载不了。
正确做法是始终从项目根目录操作,并用 -sourcepath 和 -cp 显式声明:
javac -sourcepath src/main/java -d out src/main/java/com/example/HelloWorld.java java -cp out com.example.HelloWorld
注意:-sourcepath 告诉 javac 到哪找源码(用于依赖解析),-d 指定字节码输出位置,-cp 是运行时用的类路径 —— 三者不能互相替代。
为什么 IntelliJ/Eclipse 默认不让你改 src 目录名
IDE 把 src/main/java 当作「源根(Source Root)」硬编码识别。如果你手改成了 java-src,IDE 可能仍尝试从 src/main/java 解析包,导致红色波浪线、自动导入失效、调试断点不命中。
真要自定义目录名(比如老项目遗留结构),必须手动标记源根:
- IntelliJ:右键目录 → Mark Directory as → Sources Root
- Eclipse:右键项目 → Properties → Java Build Path → Source → Add Folder
- 命令行用户别折腾——直接按标准来,省掉所有解释成本
最常被忽略的一点:resources 目录下的文件(如 logback.xml)在编译后会原样复制到 out 或 target/classes 下,但 javac 本身不处理它;你得自己用 cp -r 或写脚本同步,否则运行时报 NullPointerException 却查不到文件在哪。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











