gpt4 book ai didi

java - 为什么 javac -cp 选项区分大小写,而 java -cp 选项不区分大小写?

转载 作者:行者123 更新时间:2023-11-30 11:18:41 30 4
gpt4 key购买 nike

我注意到 javacjava 选项的大小写敏感性似乎有所不同。例如:

区分大小写的 javac 命令选项?

-cp          Yes
-sourcepath Yes
-d No

区分大小写的 java 命令选项?

-cp          No

作为这四个选项区分大小写的示例,采用以下文件夹结构:

project \ src \ Main.java
\ subf \ Sub.java
\ bin \ Main.class
\ subf \ Sub.class

Main.java,显示正在使用的 Sub 类 -

class Main {
public static void main(String[] args) {
subf.Sub.method();
}
}

此外,获取以下使用 javacjava 的批处理文件:

javac -cp bin -sourcepath src -d bin src\Main.java
java -cp bin Main

如果我删除这个项目中所有预编译的.class文件,并将名为subf的源代码子文件夹重命名为SUBF,那么当我运行上面的批处理文件,出现编译错误,因为它找不到名为 subf 的包。因此,javac-sourcepath 选项区分大小写。

(为了使下一个测试成功运行,需要将现有的 Sub.class 文件移回 bin\subf 文件夹。)如果我将重命名后的源代码subf文件夹保留为SUBF,这样源代码就无法编译了,并将bin类文件夹重命名为subf > 到 SUBF,然后当我运行批处理文件时,出现编译错误(找不到包 subf),但可执行文件运行正常。因此,javac-cp 选项区分大小写,但 java-cp 选项不区分大小写. (请注意,根据这个 SO 问题的标题,这个观察构成了我的问题的基础。)

最后,如果我将源代码 SUBF 文件夹重命名为 subf,这样源代码就可以编译了,但是保留名为 subf 的类文件夹 作为 SUBF,然后当我运行批处理文件时,我没有收到任何错误 - 批处理文件编译并运行。这意味着 javac-d 选项不区分大小写,因为它忽略了类 subf 文件夹已重命名为 SUBF,因为在该文件夹中找到的 .class 文件具有最新的日期戳值。

我已将这个简单的项目压缩到一个下载中。可以查到here (在 DropBox 上)。

最佳答案

Java 在匹配包名和类名时区分大小写。 一切 Java 在这里所做的都是区分大小写的。

但是,Windows 上的文件系统不区分大小写。是case preserving但不区分大小写。这意味着对名为 A.class 的文件的请求将找到名为 a.class 的文件(如果存在)。

这解释了为什么 Java 确实会忽略大小写。 javacjava 程序请求一个目录,操作系统通过忽略大小写搜索它。

但是你不能相信它总是正确的。在另一个不忽略大小写的操作系统上,Java 可能无法找到它在 Windows 下可以找到的文件。


您所做的一件事会影响命令的结果:

您应该将所有 Java 文件名传递给编译器。如果您使用 ant 构建,这已经为您完成了。

> javac -cp bin -sourcepath src -d bin src\Main.java
src\Main.java:5: package subf does not exist
subf.Sub.method();

这样操作不会出错:

> javac -cp bin -sourcepath src -d bin src\Main.java src\SUBF\Sub.java

关于java - 为什么 javac -cp 选项区分大小写,而 java -cp 选项不区分大小写?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23683691/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com