Статьи

Создание хранилища P2 из артефактов Maven в 2017 году

Несколько лет назад я написал сообщение в блоге о том, как создать хранилище P2 на основе артефактов Maven. Этот описанный подход в настоящее время устарел, и я хотел бы показать новый подход, основанный на плагине p2-maven, который был создан для решения именно этой проблемы.

Интеграция P2-Maven-Plugin в жизненный цикл Maven Build

Прежде всего, мы связываем сайт цели p2-maven-plugin с пакетом фазы жизненного цикла Maven. Эта цель отвечает за создание хранилища P2.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
<plugin>
  <groupId>org.reficio</groupId>
  <artifactId>p2-maven-plugin</artifactId>
  <version>1.3.0</version>
  <executions>
    <execution>
      <id>default-cli</id>
      <phase>package</phase>
      <goals>
        <goal>site</goal>
      </goals>
      <!--... -->
    </execution>
  </executions>
</plugin>

Создание хранилища P2

Теперь мы можем определить, какие артефакты Maven должны быть частью нового хранилища P2. Для p2-maven-pluging не имеет значения, имеют ли определенные артефакты уже манифест OSGi или нет. Если манифеста OSGi не существует, плагин сгенерирует его.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<execution>
<!-- ... -->
<configuration>
  <artifacts>
    <!-- specify your dependencies here -->
    <!-- groupId:artifactId:version -->
    <artifact>
      <id>com.google.guava:guava:jar:23.0</id>
      <!-- Artifact with existing OSGi-Manifest-->
    </artifact>
    <artifact>
      <id>commons-io:commons-io:1.3</id>
      <!-- Artifact without existing OSGi-Manifest-->
    </artifact>
  </artifacts>
</configuration>
</execution>

Артефакты определяются шаблоном groupId: artifactId: version . Если вы хотите сохранить некоторые данные, используйте вкладку Buildr на сайте репозитория MVN для копирования правильного формата объявления зависимостей.

В этом примере конфигурации создается хранилище P2, которое выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
target/repository
├── artifacts.jar
├── category.xml
├── content.jar
└── plugins
    ├── com.google.code.findbugs.jsr305_1.3.9.jar
    ├── com.google.errorprone.error_prone_annotations_2.0.18.jar
    ├── com.google.guava_23.0.0.jar
    ├── com.google.j2objc.annotations_1.1.0.jar
    ├── commons-io_1.3.0.jar
    └── org.codehaus.mojo.animal-sniffer-annotations_1.14.0.jar
 
1 directory, 9 files

Поведение плагина по умолчанию заключается в том, что все транзитивные зависимости определенного артефакта также загружаются и упаковываются в репозиторий P2. Если вы не хотите этого, вам нужно установить опцию transitive в false в соответствующем объявлении артефакта. Если вам нужны источники (если они существуют в репозитории Maven) определенного артефакта в репозитории P2, вам необходимо установить для параметра source значение true в соответствующем объявлении артефакта.

1
2
3
4
5
6
7
<!-- ... -->
<artifact>
  <id>com.google.guava:guava:jar:23.0</id>
  <transitive>false</transitive>
  <source>true</source>
</artifact>
<!-- ... -->

Тогда сгенерированный репозиторий P2 выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
target/repository
├── artifacts.jar
├── category.xml
├── content.jar
└── plugins
    ├── com.google.guava.source_23.0.0.jar
    ├── com.google.guava_23.0.0.jar
    └── commons-io_1.3.0.jar
 
1 directory, 6 files

Создание хранилища P2 с сгруппированными артефактами

В некоторых ситуациях вы хотите сгруппировать артефакты в так называемую функцию . p2-maven-plugin предоставляет опцию, позволяющую сгруппировать артефакт Maven непосредственно в объекты. Определение артефактов такое же, как и выше. Разница в том, что он должен быть внутри соответствующей функции. Затем для определения функции требуется некоторая метаданная информация, такая как идентификатор функции, версия функции, описание и т. Д.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<!-- ...-->
<configuration>
  <featureDefinitions>
    <feature>
      <!-- Generate a feature including artifacts that are listed below inside the feature element-->
      <id>spring.feature</id>
      <version>4.3.11</version>
      <label>Spring Framework 4.3.11 Feature</label>
      <providerName>A provider</providerName>
      <description>${project.description}</description>
      <copyright>A copyright</copyright>
      <license>A licence</license>
      <artifacts>
        <artifact>
          <id>org.springframework:spring-core:jar:4.3.11.RELEASE</id>id>
        </artifact>
        <artifact>
          <id>org.springframework:spring-context:jar:4.3.11.RELEASE</id>id>
          <source>true</source>
        </artifact>
      </artifacts>
    </feature>
    <!--...-->
  </featureDefinitions>
  <!-- ... -->
<configuration>

Тогда сгенерированный репозиторий P2 выглядит следующим образом:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
target/repository
├── artifacts.jar
├── category.xml
├── content.jar
├── features
│   └── spring.feature_4.3.11.jar
└── plugins
    ├── org.apache.commons.logging_1.2.0.jar
    ├── org.springframework.spring-aop.source_4.3.11.RELEASE.jar
    ├── org.springframework.spring-aop_4.3.11.RELEASE.jar
    ├── org.springframework.spring-beans.source_4.3.11.RELEASE.jar
    ├── org.springframework.spring-beans_4.3.11.RELEASE.jar
    ├── org.springframework.spring-context.source_4.3.11.RELEASE.jar
    ├── org.springframework.spring-context_4.3.11.RELEASE.jar
    ├── org.springframework.spring-core_4.3.11.RELEASE.jar
    ├── org.springframework.spring-expression.source_4.3.11.RELEASE.jar
    └── org.springframework.spring-expression_4.3.11.RELEASE.jar
 
2 directories, 14 files

Конечно, оба варианта (создание репозитория p2 с функцией и только с плагинами) могут быть смешаны.

p2-maven-plugin предоставляет больше опций, таких как исключение определенных транзитивных зависимостей, ссылки на другие функции затмения и так далее. Для получения дополнительной информации, пожалуйста, посмотрите на домашнюю страницу p2-maven-plugin.

Теперь мы можем генерировать P2-репозитории из артефактов Maven. Нам не хватает того, как развернуть этот репозиторий P2 в диспетчере репозитория, таком как Artifactory или Sonatype Nexus. Оба менеджера хранилища поддерживают репозитории P2, Artifactory в варианте Professional (стоимость денег) и Sonatype Nexus в варианте OSS (бесплатно). Для Nexus важно, чтобы вы использовали версию 2.x. Последняя версия, 3.x, еще не поддерживает репозитории P2.

Развертывание репозитория P2 в диспетчере репозитория

Прежде всего, мы хотим, чтобы наш сгенерированный репозиторий P2 был упакован в zip-файл. Поэтому мы добавляем плагин tycho-p2-repository-plugin в жизненный цикл сборки Maven:

01
02
03
04
05
06
07
08
09
10
11
12
13
<plugin>
  <groupId>org.eclipse.tycho</groupId>
  <artifactId>tycho-p2-repository-plugin</artifactId>
  <version>1.0.0</version>
  <executions>
    <execution>
      <phase>package</phase>
      <goals>
        <goal>archive-repository</goal>
      </goals>
    </execution>
  </executions>
</plugin>

Затем мы должны пометить этот zip-файл, чтобы Maven распознал, что ему необходимо развернуть его на этапе развертывания в диспетчере хранилища. Для этого мы добавим плагин build-helper-maven-plugin в жизненный цикл сборки Maven.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
<!-- Attach zipped P2 repository to be installed and deployed in the Maven repository during the deploy phase. -->
<plugin>
  <groupId>org.codehaus.mojo</groupId>
  <artifactId>build-helper-maven-plugin</artifactId>
  <version>3.0.0</version>
  <executions>
    <execution>
      <goals>
        <goal>attach-artifact</goal>
      </goals>
      <configuration>
        <artifacts>
          <artifact>
            <file>target/${project.artifactId}-${project.version}.zip</file>
            <type>zip</type>
          </artifact>
        </artifacts>
      </configuration>
    </execution>
  </executions>
</plugin>

Теперь сгенерированный репозиторий P2 может использоваться другими проектами. Для получения дополнительной информации о том, как обращаться с хранилищем P2, пожалуйста, ознакомьтесь с документацией вашего менеджера хранилища.

Целый пример pom.xml можно найти на Github .

связи

Опубликовано на Java Code Geeks с разрешения Сандры Парсик, партнера нашей программы JCG. См. Оригинальную статью здесь: создание репозитория P2 из артефактов Maven в 2017 году.

Мнения, высказанные участниками Java Code Geeks, являются их собственными.