Maven项目中测试类如何访问main目录下的源类?
Maven测试类访问源类的原理(非目录合并)
核心结论
Maven不会合并src/main/java和src/test/java的源文件目录,测试类能访问同包源类,是依赖编译后字节码的类路径配置,而非源文件层面的合并。
具体工作流程
- 第一步:编译主源码
Maven先编译src/main/java下的所有源文件,将生成的.class文件输出到target/classes目录,比如你的例子中:target/classes/com/example/ |-- A.class - 第二步:编译测试源码
接着编译src/test/java下的测试类,生成的.class文件输出到target/test-classes目录:target/test-classes/com/example/ |-- ATest.class - 第三步:执行测试
运行测试时,Maven会将target/classes(主类字节码)和target/test-classes(测试类字节码)同时加入JVM的类路径(classpath)。
同包访问的本质
Java的包访问权限是基于字节码的包结构,而非源文件的物理目录。只要两个类的字节码在类路径中,且包名完全一致,测试类就能直接访问源类的包级成员,无需额外配置。
比如ATest.class的包是com.example,JVM在加载com.example.A时,会自动从类路径的target/classes中找到对应的字节码文件,完成类的加载和引用。
关于临时目录的澄清
Maven不会修改你的源文件目录结构,所有编译、临时文件都存放在target目录下,你的src/main/java和src/test/java始终保持独立,不会出现你假设的“合并目录”情况。
内容的提问来源于stack exchange,提问作者hitchhiker
相关产品推荐
相关产品推荐

