2010-08-27 4 views
2

Я использую сторонний обработчик аннотации для генерации метаданных (.java-файлов) из аннотированных классов в моем проекте. Я успешно сконфигурировал процессор через Eclipse (Свойства -> Компилятор Java -> Обработка аннотаций), и генерация кода работает нормально (код автоматически создается и генерируется). Кроме того, Eclipse успешно выполняет автоматическое завершение созданных классов и их полей без каких-либо ошибок. Предположим, что у меня есть класс «some.package.Foo» и что сгенерированный класс метаданных «some.package.Foo_». При помощи автоматического завершения, я могу получить следующий код в редакторе Eclipse, без каких-либо ошибок:Eclipse 3.5+ - Обработчик аннотации: Сгенерированные классы не могут быть импортированы

import some.package.Foo_; 
... 
public class Test { 
    void test() { 
    Foo_.someField = null; // try to access a field from the generated class Foo_ 
    } 
} 

Однако, как только я на самом деле построить проект (или просто сохранить файл, так как сборки автоматически является), я получаю сообщение об ошибке «some.package.Foo_», которое не может быть разрешено. Кажется, что Eclipse генерирует и компилирует some.package.Foo_ в одно и то же время или, что более вероятно.

Я нашел две временные решения (которые практически тормозящие использование процессора аннотаций в первую очередь):

  1. Перед каждой сборки, которые генерировали классов, щелкните правой кнопкой мыши на каждом сгенерированном файле выберите Свойства и снимите галочку «Производный». После этого я делаю очистку проекта, и импорт в порядке - ошибок больше нет. Однако, если я делаю очистку еще раз, ошибки снова появляются, потому что генерация файлов приводит к тому, что галочка «Производный» будет проверяться снова (автоматически). Так что это действительно раздражает и занимает много времени.
  2. Я также снимите флажок «Производная» тик от всех этих файлов, и на этот раз я снимите флажок «Производная» галочку из папки источника и пакеты, которые содержат эти файлы. Затем я отключу обработчик аннотации , а затем выполните очистку. Там больше нет ошибок импорта, даже если я еще очистки, но нет никакой выгоды с помощью процессора аннотаций, , потому что, если я что-то изменить , который будет обновлять модель, мне нужно повернуть аннотацию процессор , и повторите эту утомительную процедуру , чтобы отключить ее, после нее сгенерировал новую версию этих файлов.

Это ошибка в Eclipse? Если да, есть ли лучшее обходное решение или быстрое исправление, чем два, о которых я говорил выше? Если нет, то что я должен попытаться решить проблему?

Я также попытался переупорядочить порядок библиотек на пути сборки, и это не поможет.

ответ

2

Я предполагаю, что вы генерируете источники в последнем раунде процессора. Это не рекомендуется и приводит именно к той проблеме, которая у вас была. Пояснение: http://code.google.com/p/acris/wiki/CodeGenerationPlatform_Pitfall_Rounds

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

Надеюсь, это поможет вам.

2

У меня есть аналогичная проблема, и единственное, что я нашел, это то, что именно импортирует специально, что не работает, но ссылки в самом классе действительно работают. Обходной путь, который я использовал, - использовать FQCN во всех случаях, когда необходим сгенерированный класс (за исключением случаев, когда сгенерированный класс находится в одном пакете, так как импорт явно не нужен).

Так использовать ваш пример, я бы:

public class Test { 
    void test() { 
    some.package.Foo_.someField = null; // try to access a field from the generated class Foo_ 
    } 
} 

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

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

+0

У нас точно такая же проблема с [AndroidAnnotations] (http://androidannotations.org), происходит случайным образом при открытии Eclipse. Не нашел никакого ясного решения, хотя изменение имени папки обработки комментариев «.apt_generated» вызывает сборку, которая иногда решает проблему. –

1

Мы столкнулись с подобной проблемой и, по-видимому, просто решили ее, поэтому подумали о ее совместном использовании в SO, если это кому-то поможет.

Мы используем:

  • Затмение Indigo (Build ID: 20120216-1857)
  • m2e Разъем для Maven
  • OpenJPA для генерации класса статические метамодели

Наша проблема:

Скажем, у нас есть пакет с именем com.abc.xyz и класс сущности, названный OurEntity. Когда мы строим проекты (JPA, EJB, EAR и т. Д. Все вместе с чистым mvn в начале), метамодельные классы генерируются. А также получить надлежащим образом упакованные в банку PU. Но когда мы пытаемся импортировать сгенерированный класс метамодели com.abc.xyz.OurEntity_, Eclipse не может его решить. OP, очевидно, прошел мимо этого момента :-). Ошибка сборки Maven, заявив, что не может решить этот класс. Не так много помощи от Google, за исключением нескольких отчетов об ошибках, таких как этот: https://bugs.eclipse.org/bugs/show_bug.cgi?id=350378
Этот отчет об ошибке сообщил, что импорт всего пакета в отличие от одного класса помог. Итак, попробовал это, но без пользы. Он также сказал (а также Дэвид Хейцман), что использование полностью квалифицированного имени класса сработало для них. Это тоже не сработало.

Решение:

Добавлено баночка PU затмить путь сборки для проекта, которую необходимо использовать классы метамодели. Внезапно все красные подчеркивания ушли (не удивительно). Но страх заключался в том, что в одном ухе могли быть два PU. Но maven автоматически позаботился об этом.

0

Поскольку это довольно старый вопрос получил некоторое внимание, не указывая на очень вероятное затмении ошибку ОП специально прошу, я хотел бы дополнить вышеупомянутые ответы с указателем на затмение багтрекер:

Cannot resolve import for generated class IF processing annotations with parameters referencing constants

в обходных включают

  1. делают импорт подстановочного пакета, определяющий сгенерированные классы (т.е.import some.package.*;)
  2. используя полное имя вашего созданного класса, т.е. со ссылкой на some.package.Foo в вашем коде, а не с помощью импорта
  3. перехода на более новую Eclipse. Эта конкретная ошибка затмения разрешена с помощью Eclipse версии 4.4 (aka Luna).