包不是必须匹配java文件所在的子目录吗?

jon*_*ive 8 java package

我今天早上为我的java认证编写了一些练习程序,并注意到我输错了包名,所以它与java文件所在的子目录不匹配.我编译代码期待错误,但所有编译文件 - - 甚至没有警告.

我google了一下,我读到的大多数页面都说包名必须与子目录相匹配.我的经验表明情况并非如此.

当我尝试运行该程序时,它不起作用,因为.class文件位于错误的目录中.我将它移动到正确的目录,并得到此错误:

Exception in thread "main" java.lang.NoClassDefFoundError: com/sample/directory
/doesnt/even/exist/OtherPackageMemberModifiers (wrong name: com/sample/chap01/O
therPackageMemberModifiers)
Run Code Online (Sandbox Code Playgroud)

所以我认为我看到的是,如果软件包和子目录不匹配,Java代码将编译,但如果你这样做,似乎没有办法运行代码.那是对的吗?

Jon*_*eet 17

包名称必须与目录名称匹配才能正确找到文件.它不具有的目录名在编译时的一些编译器(例如javac的)匹配,尽管其他人(如Eclipse)将至少给予警告.

"如果你这样做,运行代码的方法"是创建目录结构并手动将其放在那里 - 类文件本身是完全有效的.

请注意,如果使用该-d标志,javac将为您构建适当的目录层次结构,而不管源位置如何.例如:

javac -d bin ClassInPackage.java
Run Code Online (Sandbox Code Playgroud)

将创建任何所需的目录bin以匹配声明的包ClassInPackage.java.

说完了所有这些,我仍然强烈建议你让源目录与软件包匹配,即使你可以在没有它的情况下离开:)