
这篇文章就帮你把这些“套路”掰碎了讲:从最基础的src/main/java核心目录(几乎所有规范项目的源码大本营),到Spring Boot中与配置文件、资源文件的配合布局,再到一些框架特有的小调整——比如MyBatis的Mapper文件和接口的对应位置,或者微服务项目中模块拆分后的源码结构。不管你是刚学Java后端想搭对项目结构,还是接手旧项目想快速定位源码,看完这篇都能“秒懂”各个文件夹的作用,再也不用对着目录树发愁啦。
你肯定遇到过这种情况:刚搭好Java后端项目,写了个HelloWorld类, run的时候却提示“找不到主类”;或者接手别人的旧项目,翻遍文件夹都找不到核心业务代码——其实不是你笨,是Java后端源码的存放位置藏着行业默认的“规矩”。我去年帮刚学Java的朋友调项目时,他把源码直接放在项目根目录下,结果Maven根本找不到编译的地方,我只用了一步就解决:把.java文件拖到src/main/java里,项目立马跑起来了。今天就把这些“规矩”拆碎了讲,你以后不管碰什么项目,都能像“找钥匙看玄关”一样,一秒定位源码。
为什么Java后端源码大多在src/main/java?因为“约定大于配置”是行业共识
我第一次接触Maven项目时,也好奇过:“为什么大家都把源码放src/main/java?就不能自己建个‘code’文件夹吗?”后来查了Apache Maven的官方文档(https://maven.apache.org/guides/introduction/introduction-to-the-standard-directory-layout.html rel=”nofollow”)才明白,这是构建工具的“约定大于配置”——简单说就是“大家都这么玩,工具也默认认这个位置,你不用自己瞎琢磨文件夹怎么建”。
比如Maven项目的标准结构是这样的:
为什么要这么分?举个例子:你写了个UserService类放在src/main/java里,Maven编译时会自动把这个类转换成.class文件,放到target/classes对应的包路径下;而你放在src/main/resources里的application.properties,会被直接复制到target/classes里——这样项目运行时,JVM能准确找到这些文件。如果把UserService放到“code”文件夹里,Maven根本不知道要编译这个文件夹里的内容,自然会提示“找不到类”。
我之前踩过一个坑:接手一个遗留项目,前任开发把源码放到了src/java(少了main层级),结果用Maven打包时,编译出来的jar包里根本没有业务类,部署后直接报错“NoClassDefFoundError”。后来我把src/java改成src/main/java,再重新打包,问题立马解决。你看,遵守行业约定不是“教条”,是帮你避开前人踩过的坑。
再说说Gradle——现在很多新项目用Gradle代替Maven,但它的源码位置和Maven几乎一样,也是src/main/java放核心源码,src/test/java放测试源码。这就是行业共识:不管用什么构建工具,大家都默认“src/main/java是源码的家”,这样不同团队的人接手项目时,不用问别人“源码在哪”,直接找这个文件夹就行。
Spring Boot项目里,源码位置还有哪些“小细节”要注意?
很多Java后端项目都是基于Spring Boot开发的,它在Maven/Gradle的标准结构上做了一点扩展,比如更明确的资源文件划分,但核心源码位置还是src/main/java——不过你得注意这几个“小细节”,不然容易栽跟头:
Spring Boot项目里,src/main/java放的是Java类(比如@RestController标注的控制器、@Service标注的服务类),而src/main/resources放的是配置文件和静态资源:
我之前帮同事排查过一个问题:他把application.yml放到了src/main/java里,结果项目启动时提示“Could not find config file”——因为Spring Boot默认会从src/main/resources里加载配置文件,你放错位置它根本找不到。记住:Java类归src/main/java,配置和资源归src/main/resources,别混在一起。
如果你用MyBatis做持久层,肯定遇到过“Mapper接口找不到对应的XML文件”的问题——其实问题出在“位置没对应”。按照MyBatis的约定:
我之前写MyBatis代码时,把UserMapper.xml放到了resources/mapper文件夹里,结果启动时提示“BindingException: Invalid bound statement (not found)”——后来看了MyBatis的官方文档才知道,默认情况下,MyBatis会找“和接口同包路径”的XML文件,我把XML放错了位置,它当然找不到。后来我把XML文件移到resources/com/example/dao里,问题就解决了。
现在很多后端项目用Spring Cloud做微服务拆分,比如把项目分成user-service(用户服务)、order-service(订单服务)、product-service(商品服务)三个模块——每个模块都是一个独立的Maven项目,所以每个模块都有自己的src/main/java文件夹:
我去年做微服务项目时,刚开始把所有服务的源码都放到一个src/main/java里,结果包结构乱得像“垃圾堆”,找个类要翻十分钟。后来按照模块拆分,每个服务有自己的src/main/java,不仅找源码快了,构建的时候每个服务能单独打包,部署也更灵活。
为了让你更清楚不同场景的源码位置,我做了个表格对比:
场景 | 核心源码目录 | 资源文件目录 |
---|---|---|
普通Maven/Gradle项目 | src/main/java | src/main/resources |
Spring Boot项目 | src/main/java | src/main/resources(含static/templates) |
Spring Cloud微服务模块 | user-service/src/main/java | user-service/src/main/resources |
其实Java后端源码的位置真的不复杂——记住“src/main/java是核心,构建工具的约定要遵守,框架的扩展要注意”,你就能应付99%的场景。我再给你个“快速定位源码”的小技巧:不管打开什么Java项目,先找src文件夹,再进main/java,然后看包结构(比如com.example开头的包),核心业务代码肯定在里面。
你最近有没有遇到“找不到源码”的问题?比如接手的项目源码位置很奇怪,或者自己建项目时放错了文件夹?评论区告诉我,我帮你分析分析——毕竟踩过坑的人,最懂怎么避坑~
本文常见问题(FAQ)
Java后端源码最常见的存放文件夹是哪个?
几乎所有规范的Java后端项目,核心源码都放在src/main/java文件夹里——这是行业默认的“源码大本营”,不管用Maven还是Gradle构建工具,大家都认这个位置。
比如你写的Controller、Service、Dao层类,或者Spring Boot的@RestController、@Service标注的类,都该放在这里,构建工具会自动编译这个文件夹里的代码。
为什么Java后端源码大多放在src/main/java里?
主要是因为“约定大于配置”的行业共识——构建工具(比如Maven、Gradle)默认会从这个文件夹读取源码进行编译,不用你手动配置“源码路径”,省得折腾。
而且这样做能让不同团队的人接手项目时,不用问“源码在哪”,直接找src/main/java就行,减少沟通成本。我去年帮朋友调项目时,他把源码放根目录导致Maven找不到,拖到src/main/java里立马就好。
Spring Boot项目里,Java源码和配置文件要分开放吗?
要分开!Spring Boot项目的Java源码(比如控制器、服务类)放在src/main/java里,而配置文件(application.yml/properties)、静态资源(CSS/JS)、模板文件(Thymeleaf的.html)要放在src/main/resources里。
比如你把application.yml放src/main/java里,Spring Boot根本找不到配置文件,会提示“Could not find config file”——记住“Java类归java文件夹,配置资源归resources文件夹”。
用MyBatis时,Mapper接口和XML文件位置要对应吗?
必须对应!MyBatis的Mapper接口要放在src/main/java的包路径下(比如com.example.dao.UserMapper),而Mapper XML文件要放在src/main/resources里,路径得和接口的包结构一致(比如resources/com/example/dao/UserMapper.xml)。
我之前把XML放resources/mapper里,结果启动提示“Invalid bound statement”,后来调整路径对应上就好了——这是MyBatis的约定,不对应就找不到映射关系。
Spring Cloud微服务项目的源码怎么放?
Spring Cloud微服务是“模块化”结构,每个服务(比如user-service、order-service)都有自己的src/main/java文件夹。比如user-service的核心源码在user-service/src/main/java里,配置文件在user-service/src/main/resources里。
这样每个模块独立,团队开发时不用互相干扰,接手某个服务时直接找对应模块的src/main/java就行,和单应用项目的逻辑一致。