Как правильно использовать 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 (так называемая " целевая платформа"):

  1. Задавать pomDependenciesзнак равноconsider на target-platform-configuration плагин (см. здесь для примера POM)
  2. Добавьте зависимость в пакет org.eclipse.bpmn2 по его GAV в POM.

Если у вас есть Require-Bundle: org.eclipse.bpmn2 в манифесте Tycho сможет разрешить эту зависимость, так как пакет находится на целевой платформе.

Обратите внимание, что вам понадобится указанная выше конфигурация и зависимость во всех модулях, для которых транзитивно требуется пакет org.eclipse.bpmn2, поэтому вы, вероятно, захотите поместить его в родительский POM.

Другие вопросы по тегам