#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>. Спасибо за помощь!