Пакет не существует, сгенерированный java-файл из процессора раздражения

#java #maven

Вопрос:

Я пытаюсь создать класс с помощью (моего пользовательского) процессора аннотаций. (Я использую spring-boot, maven ), например

 @Matcher
public class A{...}
 

должно генерировать

 import org.hamcrest.Description;
import org.hamcrest.TypeSafeMatcher;
public class AMatcher extends TypeSafeMatcher<A>{...}
 

Однако, когда я создаю файл, он завершается package org.hamcrest does not exist ошибкой.

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

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

Что может вызвать ошибку и каков законный способ ее исправить? ( Если это возможно )

Структура файла

 src
 main
  java
   com
    testProject
     util
      A.java
 

Структура для генерируемого файла

 target
 generated-sources
  annotations
   com
    testProject
     util
      AMatcher.java
 

Спасибо за помощь!

Ответ №1:

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

Не то, что происходит.

Процессор аннотаций просто запускает текстовый файл. Во время «создания», т. е. когда обработчик аннотаций создает этот файл, это просто текстовый файл; он вообще не анализируется как исходный файл, и, следовательно, на этом этапе путь к классам не может быть применен к этому файлу.

Поскольку этот процессор создал файлы, компилятор понимает, что теперь существуют новые исходные файлы, поэтому он начинает компиляцию заново (но несколько разумно, без необходимости повторной обработки всех файлов)-это система «раундов» и то, что RoundEnv происходит в процессоре аннотаций. Это даже идеально подходит для файлов в «первом» запуске компиляции, которые не имеют смысла, пока некоторые точки доступа не создадут файлы, и в этом случае эти первые файлы будут скомпилированы во втором раунде. Другими словами, javac даже отложит ошибки типа «не найдено», такие как та самая ошибка, которую вы получили, до завершения обработки.

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

Таким образом, наиболее вероятным объяснением является то, что хамкрест (или джунит) вообще не находится на пути к классу. Возможно, у вас есть только jar junit на пути, и у вас нет временных ограничений junit (которые есть org.hamcrest здесь).

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

Комментарии:

1. ты прав. Я не заметил, что в моей зависимости от теста maven у меня был <scope>тест<scope></scope>. Спасибо за помощь!