Я использую Maven для создания библиотеки, которая использует методы генерации кода для генерации некоторого исходного кода, а затем компилирует исходный код (вместе с некоторым рукописным кодом) и выводит JAR для использования другими проектами.
Когда мне требуется библиотека из приложения, Maven загружает все транзитивные зависимости, указанные в POM библиотеки, включая зависимости, которые используются только во время генерации кода и не требуются во время выполнения.
Есть ли способ сказать Maven не публиковать все зависимости как транзитивные зависимости - только те, которые требуются для среды выполнения?
Подробности конфигурации
В библиотеке имеется несколько (не тестовых) исходных папок:
src/main/java
- здесь находится пользовательский код, предоставляемый библиотекой.
src/main/generator
- здесь находится код генератора кода, который не предоставляется библиотекой.
Файл POM Maven имеет все зависимости, которые должны быть представлены как часть API библиотеки («переходные зависимости», как AFAIU, с использованием области «компиляции»), в главном разделе и, кроме того, содержит два профили:
generate-code
- этот профиль переопределяет исходный каталог в исходный каталог генератора, выходной каталог - в пользовательский каталог target/generator-classes
, а также добавляет зависимости, необходимые только для кода генератора. Затем он запускает компилятор maven в фазе generate-sources
, а затем использует другие плагины для запуска генерации кода.
build
- этот профиль создает сгенерированные источники из target/generated-sources
(куда их помещает генерация кода), а также из основных исходных файлов Java и выводит JAR.
К сожалению, если я затем запусту mvn deploy
, результирующий версионный POM-файл в хранилище включает в себя все содержимое, включая зависимости генератора в профиле генератора, и потребительские проекты также загрузят все зависимости генератора, поместив их в путь к классу, и когда вы закрашиваете JAR-файл потребителя, в него включаются все команды генерации кода.