🧩 命令回顾
javac -d ./bin src/**/*.java
这条命令的含义是:
-
javac:Java 编译器; -
-d ./bin:指定编译输出目录为bin; -
src/**/*.java:编译所有src目录下的.java文件(包括子目录中的);**是 shell 的“递归通配符”,表示所有子目录。
✅ 编译后为什么 bin/ 目录没有 src 这一层?
✨ 关键点:Java 编译器根据 .java 文件中的包名,而不是目录结构来决定生成的目录结构
Java 的目录结构是根据**包名(package)**来创建的,而不是来源路径(如
src/)本身。
🔍 举个例子:
假设你有以下源码文件:
📄 src/com/example/Test.java
package com.example;
public class Test {
public static void main(String[] args) {
System.out.println("Hello");
}
}
你执行:
javac -d ./bin src/com/example/Test.java
结果:在 bin 目录下生成:
bin/
└── com/
└── example/
└── Test.class
注意:并没有 src/ 这一层!
✅ 为什么不保留 src/?
因为:
- Java 编译器的输出结构是根据package 路径决定的;
-d指定的是“输出的根目录”,Java 编译器在此目录下创建包结构;src/是源码根目录,对编译器来说是“输入路径”,与生成的.class路径无关。
✅ 如果你想在输出中保留 src/ 层,怎么办?
你需要不要递归通配符,而直接写:
javac -d ./bin ./src/com/example/Test.java
再手动将 class 放到:
bin/src/com/example/Test.class
但这不推荐,因为这会和 Java 的 classpath 混乱,不符合 Java 的包结构规范。
✅ 正确的 Java 编译结构推荐
Java 项目通常采用如下结构:
src/
└── com/
└── example/
└── Test.java
bin/
└── com/
└── example/
└── Test.class
用如下命令编译所有 .java 文件:
javac -d ./bin $(find src -name "*.java")
或在 Windows PowerShell 中:
javac -d .\bin (Get-ChildItem -Recurse -Filter *.java -Path src | ForEach-Object { $_.FullName })
🔚 总结
| 问题 | 原因说明 |
|---|---|
编译后没有 src/ 目录 | 编译输出目录是根据 package 而不是源路径生成的 |
如何决定 .class 的目录结构 | 由源码文件中的 package 决定 |
| 如何控制输出路径结构 | 使用 -d 设定根目录,剩下的交给 package 结构 |

被折叠的 条评论
为什么被折叠?



