Eclipse 3.5+ - процессор аннотаций: сгенерированные классы не могут быть импортированы - PullRequest
2 голосов
/ 27 августа 2010

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

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

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

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

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

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

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

Ответы [ 4 ]

2 голосов
/ 07 октября 2011

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

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

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

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

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

2 голосов
/ 04 февраля 2011

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

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

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

1 голос
/ 27 ноября 2012

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

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

  • Eclipse Indigo (номер сборки: 20120216-1857)
  • m2e Разъем для maven
  • openJPA для генерации статических метамоделей

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

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

Решение:

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

0 голосов
/ 23 августа 2014

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

Не удается разрешить импорт для сгенерированных аннотаций обработки IF класса с параметрами, ссылающимися на константы

Обходные пути включают

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