2011-11-29 15 views
8

今天早上我正在为我的java认证编写一些练习程序,并注意到我错误地输入了一个包名,所以它与java文件所在的子目录不匹配。我编译了期望出现错误的代码,但编译的所有内容文件 - 甚至没有警告。不要包必须匹配java文件所在的子目录吗?

我搜索了一下,我读的大部分页面都说包名必须与子目录相匹配。我的经验表明情况并非如此。

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

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

所以我觉得我看到的是,Java代码将编译如果包和子目录不匹配,但有如果你这样做似乎不是一种运行代码的方式。那是对的吗?

+3

的现象包路径和目录路径是多余的显示出其讨厌的头。编译器可能会发出错误。但是,这不会是100%:package src.main.java.com.sample ...或package com.sample。 ......仍然不会引发任何错误。 Javac需要基于目录(-d),它基本上是基于文件的。 –

回答

14

包名必须与目录名相匹配才能正确找到文件。它不是在编译时与某些编译器(例如,javac)的目录名称相匹配,尽管其他(如Eclipse)至少会提供警告。

“如果你这样做运行代码的方式”是创建目录结构并手动将它放在那里 - 类文件本身是完全有效的。

请注意,如果您使用-d标志,则无论源位置如何,javac都会为您构建适当的目录层次结构。例如:

javac -d bin ClassInPackage.java 

将创建bin下任何所需的目录中ClassInPackage.java声明的封装相匹配。

说了所有的thise,我还是强烈建议您使源目录匹配的包,即使你可以逃脱,没有它:)

相关问题