Необходимо ли, чтобы className класса был закодирован в className.java? - PullRequest
4 голосов
/ 16 мая 2010

Я использую maven для сборки проекта, и компиляция не удалась, потому что я поместил класс Test2 в Test.java,

но это из-за maven или просто потому, что сама java не поддерживает это?

Кстати, как я могу открыть проект maven с помощью eclipse?

Ответы [ 5 ]

6 голосов
/ 16 мая 2010

Сама спецификация языка Java на самом деле не требует этого - но она явно позволяет реализациям на основе файловой системы делать это, и большинство делают.

С раздел 7,6 :

Когда пакеты хранятся в файле система (§7.2.1), хост-система может выбрать принудительное ограничение это ошибка времени компиляции, если тип не найден в файле под именем состоит из имени типа плюс расширение (например, .java или .jav), если верно любое из следующего:

  • Тип обозначен кодом в другие единицы компиляции пакета в котором тип объявлен.
  • The тип объявлен как открытый (и, следовательно, потенциально доступен из кода в другие пакеты).

Это ограничение подразумевает, что должно быть не более одного такой тип на единицу компиляции. это ограничение облегчает компилятор для программирования Java язык или реализация Виртуальная машина Java для поиска именованных класс в пакете; например, исходный код для публичного типа wet.sprocket.Toad будет найден в файл Toad.java в каталоге мокрый / звездочка и соответствующий код объекта будет найден в файле Toad.class в том же каталоге.

Когда пакеты хранятся в базе данных (§7.2.2), хост-система не должна наложить такие ограничения. На практике, многие программисты предпочитают ставить каждый класс или тип интерфейса в своем собственном блок компиляции, независимо от того, является ли он публичный или упоминается по коду в другие сборники.

Для практических целей, я думаю, разумно предположить, что это требуется.

6 голосов
/ 16 мая 2010

A public класс с именем ClassName должен (в большинстве случаев) быть определен в файле с именем ClassName.java.

Редактировать

Хотя это не является обязательным требованием для языка Java, в большинстве (если не во всех) реализациях Java вышеупомянутая взаимосвязь между именем класса и именем файла должна сохраняться, иначе возникнет ошибка компилятора.

(Подробнее см. ответ Джона Скита .)

Причину этого можно узнать, прочитав Раздел 7.2: Пакеты из Спецификация языка Java, третье издание .

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

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

2 голосов
/ 16 мая 2010

Java требует, чтобы ваш открытый класс был внутри файла с тем же именем.

Для затмения и Maven используйте sonatype m2 плагин. Внутри вашего проекта Maven вы можете набрать

mvn eclipse:eclipse

и maven создадут для вас файл .project и .classpath. Это файлы eclipse, необходимые для работы с проектом.

Вы должны определить переменную classpath eclipse M2_REPO с помощью пути вашего локального репозитория maven.

С sonatype m2 вы можете делать maven вещи из затмения: добавлять зависимости, запускать maven цели, ...

0 голосов
/ 16 мая 2010

Связь между именем файла и именем класса следующая:

  • если в файле public class, имя файла должно совпадать с именем класса
  • вы можете иметь столько закрытых классов, сколько вам нужно, в файле с разными именами
0 голосов
/ 16 мая 2010

Я использую maven для сборки проекта, и компиляция не удалась, потому что я поместил класс Test2 в Test.java,

Исходные файлы должны быть названы в честь открытого класса , который они содержат, с добавлением суффикса .java. В вашем случае исходный файл для открытого класса Test2 должен быть Test2.java 1 .

это из-за maven или просто потому, что сама java не поддерживает это?

Жалуется компилятор Java javac, а не Maven (Maven не меняет поведение компилятора).

как я могу открыть проект maven с помощью eclipse?

Либо используйте Maven Eclipse Plugin (т.е. плагин для Maven) и просто запустите mvn eclipse:eclipse в своем проекте, а затем Import ... как существующих проектов в рабочую область в Eclipse. Вам нужно будет установить переменную classpath M2_REPO, указывающую на локальный репозиторий, чтобы использовать его. Проверьте страницу Использование для получения подробной информации.

Или (и это исключительная или) установка m2eclipse (т.е. плагин для Eclipse, который расширяет его, чтобы он мог понимать проекты Maven и взаимодействовать с ним в би -направленный путь) и Импорт ... вашего проекта как Существующие проекты Maven .

Если EXCLUSIVE не достаточно понятен, это означает: используйте один или другой, но не оба одновременно.

1 Как упоминал Джон Скит, JLS допускает это ограничение для реализаций на основе файлов. Это не относится к использованию базы данных для хранения конструкций Java (как это делал Visual Age for Java). Но в вашем случае это так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...