Maven: скрыть зависимость генерации от потребителей - PullRequest
0 голосов
/ 05 ноября 2018

Я использую 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-файл потребителя, в него включаются все команды генерации кода.

1 Ответ

0 голосов
/ 08 ноября 2018

В конечном итоге я создал другое POM только для генератора кода и использовал maven-invoker-plugin для его запуска во время основной сборки POM.

Так это выглядит так:

  • generate-resources: maven-invoker-plugin пробег generator-pom.xml
    • Вызван generator-pom.xml:
    • generate-sources: maven-antrun-plugin для создания ресурсов для генератора
    • compile: maven-compiler-plugin компилируется src/generator/java
    • compile: запустить генератор для создания источников в target/generated-sources
  • generate-sources: build-helper-maven-plugin add-source target/generated-sources
  • compile: maven-compiler-plugin компилирует src/main/java и target/generated-sources
  • test ...
  • package ...
  • deploy ...

Когда Maven запускает deploy, он публикует только основной файл POM, а maven-source-plugin видит только основной исходный каталог и созданный исходный каталог, поэтому он не собирает исходные файлы генератора.

Действие build-helper-maven-plugin add-source важно, потому что обычно плагин генератора кода автоматически добавляет каталог сгенерированного источника в список каталогов исходного кода сборки, но поскольку он выполняется в другом POM, он не может этого сделать - поэтому я использовал build-helper для выполнения этой задачи.

Основной файл POM выглядит следующим образом:

...
<plugins>
    <plugin>
        <artifactId>maven-invoker-plugin</artifactId>
        <configuration>
            <pom>generator-pom.xml</pom>
            <showErrors>true</showErrors>
            <streamLogs>true</streamLogs>
        </configuration>
        <executions>
            <execution>
                <id>generate-sources</id>
                <phase>generate-resources</phase>
                <goals>
                    <goal>run</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <executions>
            <execution>
                <phase>generate-sources</phase>
                <goals>
                    <goal>add-source</goal>
                </goals>
                <configuration>
                    <sources>
                        <source>${project.build.directory}/generated-sources/mystuff</source>
                    </sources>
                </configuration>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>${maven.compiler.plugin.version}</version>
    </plugin>

    <plugin>
        <artifactId>maven-surefire-plugin</artifactId>
        <version>2.22.1</version> <!-- needed to run JUnit 5 tests -->
    </plugin>

    <plugin>
        <artifactId>maven-jar-plugin</artifactId>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-javadoc-plugin</artifactId>
        <executions>
            <execution>
                <goals>
                    <goal>jar</goal>
                </goals>
            </execution>
        </executions>
    </plugin>

</plugins>

(POM генератора относится ко многим вещам с закрытыми исходными кодами моей компании, так что не заглядывайте туда, извините).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...