为什么javac' s -cp选项区分大小写,但java&#c; s -cp选项不是?

时间:2014-05-15 16:18:50

标签: java classpath javac case-sensitive

我注意到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文件夹。)如果我保留重命名的源代码{{1} }文件夹为subf,因此无法编译源代码,并将名为SUBF的bin类文件夹重命名为subf,然后当我运行批处理文件时,我得到一个错误(SUBF)进行编译,但可执行文件运行正常。因此,can't find package subf' javac选项区分大小写,但-cp java选项不是。 (请注意,根据此SO问题的标题,此观察结果构成了我的问题的基础。)

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

我已将此简单项目压缩到下载中。它可以在here找到(在DropBox上)。

1 个答案:

答案 0 :(得分:1)

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
相关问题