Как скопировать файл с помощью Maven и указать первый модуль в качестве целевой папки? - PullRequest
0 голосов
/ 28 января 2020

Это больше, чем простой вопрос в теме. Я просмотрел предлагаемые ссылки на «похожие вопросы», и ни один из них не помог полностью.

ПРЕДПОСЫЛКИ: Создание системы плагинов для приложения. Частично это потребует от других команд создания самих плагинов. Структура каждого построенного плагина имеет проект реактора с двумя модулями, один из которых объединяется с другим с помощью плагина Shade. В результате создается один файл JAR, который создается в целевой папке одного из модулей. Это все прекрасно работает. Поскольку у нас есть некоторые вещи, которые потребуются всем плагинам (настройки, структура, зависимости), мы создали еще один проект project-plugin-parent, в котором есть только POM, содержащий все общие ссылки и зависимости. Каждый плагин должен ссылаться на этот родительский POM для всех общих элементов, так что разработчикам не нужно беспокоиться об этом. Одним из параметров, передаваемых в утилиту, является файл jar.

В рамках этого POM у нас есть некоторые утилиты, которые мы помечаем как зависимости, которые затем копируются в локальный utils папки. После загрузки этой утилиты мы запускаем ее (в зависимости от используемого профиля) ... Чтобы запустить ее, ее необходимо обнаружить. Когда я помещаю зависимости и команды копирования в POM плагина (первый модуль), он прекрасно работает. Но мы хотим, чтобы он действительно находился в project-plugin-parent POM ... Это помещает папку utils в папку реактора ... Хорошо, я могу работать с этим. Проблема возникает, когда она затем пытается запустить утилиту ... потому что она находится в родительском POM, она пытается запустить ее оттуда и поэтому неправильно передает неверный файл JAR в параметрах.

ОК, вот как выглядит структура

project-plugin-parent.pom

plugin-project-reactor (with dependency on project-plugin-parent.pom
|
|-- plugin-project-main
|
\-- plugin-second 

Я бы предпочел, чтобы утилита оказалась внутри plugin-project-main ... но если она окажется в Структура реактора это нормально. Каким-то образом мне нужно иметь возможность попасть в папку / jar plugin-project-main. В то же время я не могу просто жестко закодировать имя папки, так как оно будет варьироваться от проекта к проекту.

В proect-plugin-parent приведен узел конфигурации для команды maven copy.

<configuration>
  <artifactItems>
      <artifactItem>
          <groupId>gov.va.bip.docgen</groupId>
          <artifactId>my-project-svc-rest</artifactId>
          <version>1.0.0</version>
          <type>jar</type>
          <destFileName>my-service.jar</destFileName>
      </artifactItem>
  </artifactItems>
  <outputDirectory>${project.build.directory}/../utils</outputDirectory>
</configuration>

Это успешно загрузит файл из nexus и скопирует его в папку utils внутри уровня реактора. Опять же, я бы предпочел, чтобы он попал в основную папку плагинов.

Вот exe c этого загруженного jar:

                        <configuration>
                            <executable>java</executable>
                            <arguments>
                                <argument>-Dloader.path=${project.build.directory}/${project.build.finalName}/${artifactId}.jar</argument>
                                <argument>-Dserver.port=10080</argument>
                                <argument>-jar</argument>
                                <argument>${project.build.directory}/../utils/my-service.jar</argument>
                            </arguments>
                            <includeProjectDependencies>false</includeProjectDependencies>
                        </configuration>

Вы можете видеть, что мы проходим путь к jar плагина, который находится в plugin-project-main / target ... В приведенной выше конфигурации вместо этого я получаю ссылку на банку реактора (которая не существует).

Так есть ли способ динамически получить эту папку главного модуля в реакторе? ? Если я могу получить это, то я могу либо поместить утилиты в папку модуля (предпочтительно), либо, по крайней мере, передать правильный путь к утилите, когда она будет выполнена.

1 Ответ

0 голосов
/ 29 января 2020

Ну, я нашел ответ на мою проблему - с помощью активации. Мне удалось добавить активацию в профиль, чтобы найти указанный каталог c (который будет существовать только в основной структуре модуля).

<activation>
  <activeByDefault>false</activeByDefault>
  <file>
    <exists>
      target/classes/content-root
    </exists>
  </file>
</activation>

Файл, загруженный только в папку utils, теперь делает это один раз.

Теперь это приводит к другой проблеме, но это для другого потока.

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