Как правильно использовать Nexus и Maven/Jenkins для сторонней библиотеки (не в репозитории Maven) и необходимого репозитория p2
Мы используем Jenkins/Maven для BuildManagement и непрерывной интеграции. Управление сторонними библиотеками должно осуществляться с помощью Nexus Server, который мы настроили.
- Это сторонняя библиотека org.eclipse.bpmn2 0.7.0
- Насколько нам известно, эта библиотека не размещена в удаленном репозитории Maven.
- Мы загрузили сторонние библиотеки в размещенный сторонний репозиторий Nexus
- У нас есть некоторые прокси-серверы Nexus, указывающие на сеть (которые работают)
Теперь к (возможно) проблемной части:
- Наш проект состоит из плагинов Eclipse
- Поэтому нам нужен доступ к репозиторию eclipse p2
- Зависимости от сторонних библиотек описаны в Manifest.MF
- Nexus Open Source не поддерживает репозитории p2
- Поэтому мы должны добавить репозиторий Eclipse p2 в POM проекта
Во-первых, (вероятно) соответствующие настройки из нашего файла settings.xml от Maven, которые использует Jenkins:
<localRepository>/var/lib/jenkins/local_repo</localRepository>
У нас есть местный репозиторий Maven.
Может быть, важно: как работают местный репозиторий Maven и Nexus? Является ли локальный репозиторий избыточным? Может ли это конфликтовать с библиотеками Nexus? Или Maven загружает только зависимости от Nexus и сохраняет их в локальном хранилище? Должны ли мы опустошить его после установки Nexus?
<mirrors>
<mirror>
<!--This sends everything else to /public -->
<id>nexus</id>
<mirrorOf>*</mirrorOf>
<url>http://localhost:8082/nexus/content/groups/public</url>
</mirror>
</mirrors>
<profile>
<id>nexus</id>
<!--Enable snapshots for the built central repo to direct
all requests to nexus via the mirror -->
<repositories>
<repository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>central</id>
<url>http://central</url>
<releases><enabled>true</enabled></releases>
<snapshots><enabled>true</enabled></snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
Как вы, вероятно, видите, мы сейчас используем конфигурацию Nexus по умолчанию. Теперь к содержанию POM соответствующего проекта:
<repositories>
<!--
<repository>
<id>UML2</id>
<layout>p2</layout>
<url>http://download.eclipse.org/modeling/mdt/updates/releases/</url>
</repository>
-->
<repository>
<id>indigo</id>
<layout>p2</layout>
<url>http://download.eclipse.org/releases/indigo</url>
</repository>
</repositories>
Мы попытались включить репозитории p2 в Nexus, но потом увидели, что версия с открытым исходным кодом не может обрабатывать репозитории p2. Поэтому нам нужно иметь их в проекте POM, как репозитории в дополнение к Nexus. Репозиторий MDT закомментирован, потому что кажется, что он работает без него.
Зависимость от org.eclipse.bpmn2 находится в manifest.MF соответствующего плагина, использующего его:
Require-Bundle:
org.eclipse.bpmn2;bundle-version="0.7.0";visibility:=reexport
Библиотека была загружена в Nexus (с использованием параметров GAV):
- GroupID: org.eclipse
- ArtifactID: org.eclipse.bpmn2
- версия: 0.7.0.201111021300
- упаковка: банка
МОЖЕТ БЫТЬ ВАЖНЫМ: классификатор был оставлен пустым. Что следует вводить здесь?
При запуске задания Jenkins и Maven с параметром -e -X выдается следующее:
[DEBUG] P2resolver.addMavenProject de.some.tool:pom:2.0
[INFO] Adding repository (cached) http://download.eclipse.org/releases/indigo
[DEBUG] Added p2 repository indigo (http://download.eclipse.org/releases/indigo)
[INFO] Cannot complete the request. Generating details.
[INFO] Cannot complete the request. Generating details.
[INFO] {org.osgi.framework.executionenvironment=OSGi/Minimum-1.0,OSGi/Minimum-1.1, osgi.ws=gtk, osgi.arch=x86, osgi.os=linux, org.eclipse.update.install.features=true, org.osgi.framework.system.packages=}
[ERROR] Cannot resolve project dependencies:
[ERROR] Software being installed: de.modeltype.bpmn2 1.0.0.qualifier
[ERROR] Missing requirement: de.modeltype.bpmn2 1.0.0.qualifier requires 'bundle org.eclipse.bpmn2 0.7.0' but it could not be found
[ERROR]
mavenExecutionResult exceptions not empty
message : Internal error: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from de.modeltype.bpmn2 1.0.0.qualifier to bundle org.eclipse.bpmn2 0.7.0.", "No solution found because the problem is unsatisfiable."]
cause : "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from de.modeltype.bpmn2 1.0.0.qualifier to bundle org.eclipse.bpmn2 0.7.0.", "No solution found because the problem is unsatisfiable."]
Stack trace :
org.apache.maven.InternalErrorException: Internal error: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from de.modeltype.bpmn2 1.0.0.qualifier to bundle org.eclipse.bpmn2 0.7.0.", "No solution found because the problem is unsatisfiable."]
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:168)
at org.jvnet.hudson.maven3.launcher.Maven3Launcher.main(Maven3Launcher.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.codehaus.plexus.classworlds.launcher.Launcher.launchStandard(Launcher.java:329)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:239)
at org.jvnet.hudson.maven3.agent.Maven3Main.launch(Maven3Main.java:158)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:104)
at hudson.maven.Maven3Builder.call(Maven3Builder.java:70)
at hudson.remoting.UserRequest.perform(UserRequest.java:118)
at hudson.remoting.UserRequest.perform(UserRequest.java:48)
at hudson.remoting.Request$2.run(Request.java:287)
at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from de.modeltype.bpmn2 1.0.0.qualifier to bundle org.eclipse.bpmn2 0.7.0.", "No solution found because the problem is unsatisfiable."]
at org.eclipse.tycho.p2.impl.resolver.ProjectorResolutionStrategy.resolve(ProjectorResolutionStrategy.java:106)
at org.eclipse.tycho.p2.impl.resolver.P2ResolverImpl.resolveProject(P2ResolverImpl.java:102)
at org.eclipse.tycho.p2.impl.resolver.P2ResolverImpl.resolveProject(P2ResolverImpl.java:69)
at org.eclipse.tycho.p2.resolver.P2TargetPlatformResolver.doResolvePlatform(P2TargetPlatformResolver.java:342)
at org.eclipse.tycho.p2.resolver.P2TargetPlatformResolver.resolvePlatform(P2TargetPlatformResolver.java:162)
at org.eclipse.tycho.core.resolver.DefaultTychoDependencyResolver.resolveProject(DefaultTychoDependencyResolver.java:85)
at org.eclipse.tycho.core.maven.TychoMavenLifecycleParticipant.afterProjectsRead(TychoMavenLifecycleParticipant.java:91)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:273)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
... 19 more
channel stopped
Finished: FAILURE
Что мы делаем не так?
2 ответа
У вас здесь происходит несколько вещей:
Может быть, важно: как работают местный репозиторий Maven и Nexus? Является ли локальный репозиторий избыточным? Может ли это конфликтовать с библиотеками Nexus? Или Maven загружает только зависимости от Nexus и сохраняет их в локальном хранилище? Должны ли мы опустошить его после установки Nexus?
Maven отправляет запросы на артефакты, не найденные в локальном репозитории, из удаленных репозиториев. Nexus - это удаленный репозиторий, даже если он находится на той же машине. Поэтому, чтобы получать запросы, выполняемые через новую настройку Nexus, вам необходимо сначала очистить локальное хранилище. Тогда вещи будут кэшироваться в Nexus и в локальном репо Maven.
Следующее, что у вас есть это:
<mirrorOf>*</mirrorOf>
который говорит maven делать запросы к Nexus для ВСЕХ репозиториев. Это будет включать репо P2, который вы определили ниже в ваших настройках. Чтобы сказать Maven обойти зеркало, вы хотите сделать это:
<mirrorOf>*,!indigo</mirrorOf>
Кроме того, плагины p2 для Nexus доступны для открытого исходного кода, они просто не включены в комплект по умолчанию, но вы можете скачать и установить их вручную.
И, наконец, у нас есть IRC комнаты и списки рассылки и базы знаний, которые могут быть вам полезны: http://www.sonatype.org/nexus/participate
По умолчанию Tycho не ищет в репозиториях Maven разрешения зависимостей. (Справочная информация: Поиск в полном хранилище Maven будет невозможен, поскольку в индексе хранилищ Maven недостаточно информации, чтобы Tycho мог выполнить разрешение зависимостей, и поэтому Tycho будет вынужден загрузить и проанализировать все артефакты Maven.)
Однако можно добавить некоторые артефакты Maven в область поиска Tycho (так называемая " целевая платформа"):
- Задавать
pomDependencies
знак равноconsider
наtarget-platform-configuration
плагин (см. здесь для примера POM) - Добавьте зависимость в пакет org.eclipse.bpmn2 по его GAV в POM.
Если у вас есть Require-Bundle: org.eclipse.bpmn2
в манифесте Tycho сможет разрешить эту зависимость, так как пакет находится на целевой платформе.
Обратите внимание, что вам понадобится указанная выше конфигурация и зависимость во всех модулях, для которых транзитивно требуется пакет org.eclipse.bpmn2, поэтому вы, вероятно, захотите поместить его в родительский POM.