Импорт Java с подстановочными знаками не работает, а импорт без подстановочных знаков работает - PullRequest
0 голосов
/ 27 апреля 2018

Я столкнулся с проблемой в своем исследовании о пакете 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.  

В этом случае, если я удаляю Foo.java и Bar.java из src /, исходный файл компилируется без ошибок.

чехол: я импортирую с import hoge.fuga.Foo; import hoge.fuga.Bar;

Исходный файл скомпилирован без ошибок.

Интересно, почему поведение компилятора отличается при использовании подстановочного знака?

Мне кажется, только когда я импортирую с подстановочными знаками, компилятор проверяет исходный код в каталоге src /.

Это связано с настройкой Java, такой как classpath или sth?

Я думаю, что это редкий случай, но я просто хотел бы знать, почему это происходит, только когда я использую подстановочный знак.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2018

Ваши файлы .java должны быть перемещены в каталог их объявленных пакетов, и я настоятельно рекомендую разбить ваши исходные файлы и скомпилированные файлы на две разные директории, чтобы избежать проблем с classpath.

Например, если ожидаемое полное имя класса (FQCN) - hoge.fuga.Foo, а корень компиляции - src/, то файл .java должен быть src/hoge/fuga/Foo.java, а не src/Foo.java.

Вы также храните свои файлы .class в src/, что также является плохой идеей. Настройте компилятор так, чтобы файлы классов помещались в отдельный каталог вместе с src/, например build/:

+ my-project/
    + src/
        - senario.java //import hoge.fuga.*
        + hoge/
            + fuga/
                - Foo.java //package hoge.fuga
                - Bar.java //package hoge.fuga
    + build/
        - senario.class
        + hoge/
            + fuga/
                - Foo.class
                - Bar.class

Это стабилизирует вашу сборку и, скорее всего, решит вашу проблему.

0 голосов
/ 27 апреля 2018
file does not contain class Foo

Эта ошибка означает, что класс, содержащийся в вашем файле Foo.java, не имеет правильного имени. В Java вы должны назвать свой файл по имени публичного класса, определенного в. Файл Foo.java должен объявить:

public class Foo {
}

Будьте осторожны с вашими именами файлов, «senario.java» неверно называет. Вы должны начать свое имя класса с заглавной буквы (и файл с точно таким же регистром) Здесь сценарий.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.

...