Установите модульные файлы проекта maven в родительский каталог внутри локального репозитория - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующая структура проекта:

parent (packing: pom)
    + framework (packing: jar)
    + plugins (packing: pom)
        + plugin_1 (packing: pom)
            + impl (packing: jar)
            + e2e_test (packing: jar)
        + plugin_2 (packing: pom)
            + impl (packing: jar)
            + e2e_test (packing: jar)

Внутри plugin_1.impl и plugin_2.impl У меня есть resource.xml, который описывает плагин.

Сборка в порядке,то есть когда я хочу построить весь проект, он строит по порядку.Однако при установке не удается создать такую ​​же структуру.После установки локальный репозиторий выглядит так:

com/company
    + parent/version
        + pom file
    + framework/version
        + jars
    + plugins/version
        + pom file
    + plugin_1/version
        + pom file
    + plugin_1.impl/version
        + jar
    + plugin_1.e2e_tests/version
        + jar
    + plugin_2/version
        + pom file
    + plugin_2.impl/version
        + jar
    + plugin_2.e2e_tests/version
        + jar

Но я хочу:

com/company/parent/version
    + framework.jar
    + plugins
        + plugin_1.jar
        + plugin_1.xml (renamed resource.xml)
        + plugin_2.jar
        + plugin_2.xml (renamed resource.xml)

Есть ли способ создать нужную структуру?

Я пробовалmaven-install-plugin Например:

mvn org.apache.maven.plugins:maven-install-plugin:3.0.0-M1:install-file \
    -Dfile=parent/plugins/plugin_1/impl/resource.xml \
    -DgroupId=com.company \
    -DartifactId=parent \
    -Dversion=1.0-SNAPSHOT \
    -Dpackaging=file \
    -DgeneratePom=true

или pom.xml эквивалент этого (но для банки):

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-install-plugin</artifactId>
    <version>3.0.0-M1</version>
    <executions>
        <execution>
            <phase>install</phase>
            <goals>
                <goal>install-file</goal>
            </goals>
            <configuration>
                <groupId>${project.groupId}</groupId>
                <artifactId>${project.parent.parent.artifactId}</artifactId>
                <version>${project.version}</version>
                <packaging>jar</packaging>
                <file>${project.build.directory}/${project.build.finalName}.jar</file>
            </configuration>
        </execution>
    </executions>
</plugin>

Но это всегда будет переименовывать файл в соответствии с artifactId и в итоге я перезаписал один и тот же файл.

Мне удалось создать описанную структуру с помощью copy-rename-maven-plugin в целевом каталоге самого верхнего родителя.

Я хочу эту структуру, потому что:

  1. В framework можно использовать любой jar, помещенный в каталог plugins с соответствующим дескриптором.
  2. Я не хочу делать это вручную каждый раз, когда перекомпилирую илиизменить что-то внутри нескольких плагинов.
  3. Сквозные тесты для модуля работают, вызывая framework plugin_1 (args) внутри теста и проверяя результат.Для этого мне нужна рабочая структура внутри локального репозитория, от которой зависит тестовый проект.

Есть ли способ создать нужную структуру внутри локального репозитория?

Ответы [ 2 ]

0 голосов
/ 08 апреля 2019

Локальный репозиторий Maven имеет фиксированную структуру каталогов. Эта структура не должна быть изменена. Он отражает координаты Maven (groupId, artifactId, версия).

0 голосов
/ 08 апреля 2019

Похоже, вы неправильно понимаете Maven (локальные) репозитории несколькими способами:

  1. Локальный репозиторий - это кэш для артефактов в удаленных репозиториях (хотя вам не нужно использовать последний для созданных вами артефактов, если вам не нужно делиться ими с другими). ​​
  2. Репозиторий предназначен для разрешения зависимостей в время сборки , а не время выполнения .
  3. Полный путь в хранилище идентифицирует определенный артефакт (JAR, WAR, EAR, ... или просто POM) с определенной версией, поскольку его путь получен из Maven Coordinates с его идентифицирующая триада GAV (groupId, artifactId, version). Где:

    <groupId>com.my.company</groupId>
    <artifactId>my-artifact</artifactId>
    <version>1.0.0</version>
    

    становится структурой каталогов:

    ~/.m2/repositories
      + com
        + my
          + company
            + my-artifact
              + 1.0.0
                + my-artifact-1.0.0.jar  [or war, ear, ...]
                + my-artifact-1.0.0.pom
    

    Нет представления о зависимостях (или ресурсах, подобных *.xml) в иерархической (под) структуре артефакта в репозитории Maven (локальном или удаленном), который будет динамически использоваться во время выполнения (тестов).

    Вот почему вы видите все артефакты на одном уровне com/company после вашей сборки (включая install). Все они равны. Ни один из них не является предпочтительным по сравнению с другим с точки зрения Maven.

UPDATE

Возможное решение:

Добавьте framework и соответствующую реализацию плагина в качестве зависимостей к вашим тестовым проектам и соответственно используйте их в тестовом коде:

plugin_1.e2e_tests

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>framework</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>plugin_1.impl</artifactId>
    <version>...</version>
</dependency>

plugin_2.e2e_tests

<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>framework</artifactId>
    <version>...</version>
</dependency>
<dependency>
    <groupId>com.mycompany</groupId>
    <artifactId>plugin_2.impl</artifactId>
    <version>...</version>
</dependency>
...