使用通配符的Java导入在没有通配符的导入工作时不起作用

时间:2018-04-27 16:09:14

标签: java import compiler-errors package

我在研究Java包时遇到了麻烦。

环境

  • Java8 1.8.9_162
  • Windows7的

目录

我尝试创建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

当我编译Senario.java

案例:我使用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?

我想象这是罕见的情况,但我只是想知道为什么只有在我使用通配符时才会发生这种情况。

2 个答案:

答案 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/

这样可以稳定您的构建,并可能解决您的问题。