Использование классов из /target
Я использую JOOQ. JOOQ генерирует метаклассы, которые потом используются для генерации запросов в базу. Окей. Рекомендуется генерировать классы в /target/generated-sources/jooq... Сгенерировал. Но когда я пытаюсь вызвать этот класс в коде, IDEA не видит эти классы.
Подскажите, как мне быть?
Ответы (1 шт):
Нужно выделить метаклассы в отдельную библиотеку. В одном модуле maven классы генерируются, в других модулях этот модуль проставляется как зависимость и используются сгенерированные метаклассы.
При таком подходе модель базы автоматически отделяется от бизнес-логики.
Рекомендуется генерировать классы в
/target/generated-sources/jooq
Это так, но в документации есть раздел (Code generation and version control) в котором вопрос генерации освещается подробнее. Разделяются два общих подхода:
Генерированный код является частью кода приложения.
Метаклассы генерируются в исходном коде (
src/main/java), хранятся в системе контроля версий. Генерация проводится, как правило, вручную, а не при сборке, т.к. возможны изменения.Преимущества:
- Генерация отделена от сборки. Для сборки проекта не нужна БД.
- Метаклассы не зависят от БД. Это может быть удобно если схема БД изменяется внешними силами (например, другими разработчиками).
- Изменения схемы БД явно хранятся в системе контроля версий.
Недостатки:
- Метаклассы могут расходиться с базой данных.
Генерированный код является частью производных артефактов.
Метаклассы генерируются в процессе сборки автоматически (
target/generated), не хранятся в системе контроля версий.Преимущества:
- Модель данных всегда соответствует БД.
- Метаклассы не занимают место в исходном коде.
Недостатки:
- Сборка зависит от базы данных.
Как правило используют второй подход, чтобы избежать разночтений между БД и Java-кодом, но при необходимости можно использовать как первый подход, так и некое промежуточное решение.
В любом случае метаклассы лучше хранить отдельно.