我在研究Java包时遇到了麻烦。
我尝试创建hoge.fuga包(仅用于学习Java)并将文件放在如下目录中。
+ src/
- senario.java //import hoge.fuga.*
- senario.class
- Foo.java //package hoge.fuga
- Bar.java //package hoge.fuga
+ hoge/
+ fuga/
- Foo.class
- Bar.class
import hoge.fuga.*;
编译错误。
bad source file: .\Foo.java
file does not contain class Foo
Please remove or make sure it appears in the correct subdirectory of the source path.
在这种情况下,如果我从src /中删除Foo.java和Bar.java,则编译源文件时没有错误。
import hoge.fuga.Foo; import hoge.fuga.Bar;
编译源文件时没有错误。
在我看来,只有当我使用通配符导入时,编译器才会检查src /目录中的源代码。
这与java设置有关,例如classpath还是sth?
我想象这是罕见的情况,但我只是想知道为什么只有在我使用通配符时才会发生这种情况。
答案 0 :(得分:0)
file does not contain class Foo
此错误表示您的Foo.java文件包含的类没有正确的名称。在Java中,您应该使用定义的公共类的名称来命名文件。文件Foo.java应该声明:
public class Foo {
}
小心你的文件名,'senario.java'是错误的命名。您应该使用大写字母(以及具有相同确切大小写的文件)开始您的类名。这里的Scenario.java可能更好。
此外,当您为类声明包时,请确保存在相应的文件夹层次结构。在你的情况下,一个带有hoge.fuga包的类应该在/ src / hoge / fuga文件夹中。
您还应该配置项目。看来你的构建和源目录混杂在一起。
更好(和标准)的文件层次结构将是
+ src/main/
- Scenario.java
+ hoge/
+ fuga/
- Foo.java
- Bar.java
+ /target
- Scenario.class
+ hoge/
+ fuga/
- Foo.class
- Bar.class
要配置目标目录,必须在IDE中更改项目设置。
答案 1 :(得分:0)
您的.java文件应该移动到其声明的包的目录中,我强烈建议将源文件和编译的文件拆分为两个不同的目录,以避免类路径问题。
例如,如果您的预期完全限定类名(FQCN)为hoge.fuga.Foo
且编译根为src/
,那么.java文件应为src/hoge/fuga/Foo.java
,而不是{{ 1}}。
您还将.class文件存储在src/Foo.java
中,这也是一个坏主意。设置编译器以将类文件放在src/
旁边的单独目录中,例如src/
:
build/
这样可以稳定您的构建,并可能解决您的问题。