2010-05-16 2 views
4

Я использую Maven для создания проекта и скомпилировать не удалось, потому что я поставил класс Test2 в Test.java,Нужно ли, чтобы класс className был закодирован в className.java?

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

BTW, как я могу открыть проект maven с затмением?

+0

Не знаю, как Maven, но имя класса должно совпадать с именем класса компиляции (^ .java), иначе это приведет к сбою. –

+0

Кроме того, имя класса должно начинаться с заглавной буквы. – Kobi

+1

Пожалуйста, задавайте только один вопрос одновременно. – tangens

ответ

6

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

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

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

(Для получения дополнительной информации, пожалуйста, обратитесь к Jon Skeet's answer.)

Причина этого можно найти, прочитав Section 7.2: Packages из The Java Language Specification, Third Edition.

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

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

2

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

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

mvn eclipse:eclipse 

и Maven создаст .project и .classpath для вас файл. Это файлы затмения должны работать с проектом.

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

С Sonatype м2 вы можете сделать Maven вещей изнутри затмения: добавить зависимости, запускать цели Maven, ...

+0

Плагин m2eclipse имеет ** ничего **, связанный с плагином maven-eclipse. Если вы используете первое, вам не нужно запускать 'mvn eclipse: eclipse'. Если вы используете позже, вам не нужно использовать m2eclipse. –

+0

Кажется, я могу напрямую запустить 'mvn eclipse: eclipse' без установки сонатипа me plugin? – httpinterpret

+0

@ pascal-thivent: Да, вы совершенно правы. Я добавил m2, потому что это облегчает работу в eclipse. Но я пропустил сказать, что это две разные темы. – tangens

0

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

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

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

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

Как я могу открыть проект maven с затмением?

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

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

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

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

+0

Я не думаю, что m2eclipse будет работать, потому что в созданном '.project' есть такой комментарий. – httpinterpret

+0

' NO_M2ECLIPSE_SUPPORT: файлы проекта, созданные с помощью maven-eclipse-plugin, не поддерживаются в M2Eclipse. ' – httpinterpret

+0

@httpinterpret Я прямо писал, что они ЭКСКЛЮЗИВ, вы используете тот или иной, а не оба в одно и то же время. Я не могу быть яснее, просто внимательно прочитаю. –

6

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

От section 7.6:

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

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

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

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

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

0

Связь между именем файла и имя класса выглядит следующим образом:

  • если у вас есть public class в файле, имя файла должно быть таким же, как имя класса
  • вы можете иметь столько, сколько не- публичные классы, как вы хотите, в файле с разными именами
Смежные вопросы