Несколько лет назад я написал сообщение в блоге о том, как создать хранилище 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.jar1 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.jar1 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.jar2 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 .
связи
- Старый пост в блоге с 2013 года
- P2 Maven Плагин
- Весь исходный код примера на Github
| Опубликовано на Java Code Geeks с разрешения Сандры Парсик, партнера нашей программы JCG. См. Оригинальную статью здесь: создание репозитория P2 из артефактов Maven в 2017 году.
Мнения, высказанные участниками Java Code Geeks, являются их собственными. |
