$ javac -d ./bin src/**/*.java 这样编译之后,目录结构为什么没有src包了

🧩 命令回顾

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 结构
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值