我注意到javac
和java
选项的区分大小写似乎有所不同。例如:
区分大小写的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();
}
}
另外,请使用以下批处理文件,该文件使用javac
和java
:
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上)。
答案 0 :(得分:1)
Java在匹配包名和类名时是区分大小写的。 一切 Java在这里区分大小写。
但是,Windows上的文件系统不区分大小写。它是case preserving但不区分大小写。这意味着对名为A.class
的文件的请求会找到名为a.class
的文件(如果存在)。
这解释了为什么Java看起来似乎忽略了一些情况。 javac
或java
程序要求提供目录,操作系统会通过忽略大小写来搜索它。
但你不能依靠这一点永远是真的。在另一个不忽略大小写的操作系统上,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