Обработка зависимостей не-OSGi при интеграции Maven, Tycho и Eclipse
У меня есть куча плагинов на основе Eclipse, которые я переносил в Maven/Tycho. Большинство этих плагинов зависят от отдельных библиотек, которыми я сейчас управляю через Maven, а не путаются с .jar
файлы.
Самая громоздкая часть моей текущей настройки связана с явной неспособностью Tycho обрабатывать артефакты только для Maven (т.е. не OSGi). Моя текущая настройка работает так:
в
pom.xml
каждого плагина Eclipse я выпускаюunpack
цельmaven-dependency-plugin
в течениеinitialize
фаза. Это распаковывает артефакты, которые я указываю в отдельныйtarget/dependencies
каталог.target/dependencies
каталог добавляется как выходной каталог вbuild.properties
, так что Tycho может добавить его в classpath при компиляции:source.. = src/main/java/ output.. = target/classes/ output.. = target/dependencies/
target/dependencies
каталог добавлен вBundle-ClassPath
библиотека вMETA-INF/MANIFEST.MF
,
Эти настройки позволяют compile
Maven директива для компиляции плагина. Импортировать проект из VCS и вручную указать target/dependencies
каталог как папка классов в Eclipse позволяет упомянутой IDE также компилировать плагин.
К сожалению, это довольно громоздкое решение по нескольким причинам:
Конфигурирование
maven-dependency-plugin
требует перечисления всех артефактов, которые должны быть распакованы. Можно использоватьunpack-dependencies
вместоunpack
, но это также распаковало бы все зависимости OSGi - иметь половину Eclipse, распакованного в каждом каталоге проекта, не моя идея веселья...Добавление папки классов в Eclipse требует Maven
initialize
быть запущенным один раз, так чтоtarget/dependencies
каталог создан.Нет исходной связи между проектами Maven и их проектами Tycho в Eclipse. Чтобы перейти от проекта Maven к проекту Tycho, чтобы, например, Eclipse мог показать потенциальную проблему компиляции, нужно
mvn install
проект Maven, а затем запуститьmvn clean initialize
в проекте Tycho удалить ранее распакованные зависимости и вытащить текущий набор. Затем вы должны обновить проект Eclipse и надеяться, что Eclipse сделает все правильно.В том же духе, просмотр источника зависимости от проекта Tycho не покажет первичный исходный файл, а то, что доступно в
target/dependencies
- вполне возможно, просто.class
файл.
Я думаю, что должен быть более разумный способ сделать это - что-то, что позволило бы проектам Eclipse и Maven интегрироваться более тесно.
Итак, что мне не хватает? Какова рекомендуемая настройка для этого варианта использования? Есть ли лучшая альтернатива? Желательно что-то, что не потребует установки связок Nexus и / или p2-репозиториев?
3 ответа
Кажется, мы применяем аналогичные стратегии. Тем не менее, я использую смешанный репозиторий (имеющий maven и p2).
- Для распаковки зависимостей я использую плагин maven-dependency-plugin, чтобы поместить их в цель / зависимость (см. Ниже).
- 1.1. copy-зависимости делают то, что нужно без распаковки.
- Ваш источник и результаты примерно такие же, как у меня.
- 2.1. Да, mvn должен инициализировать цель / зависимости
- Я включаю только необходимые банки в манифест, потому что 1 будет получать много ненужных банок.
- 3.1. Я вручную выбираю соответствующие банки.
- 3.2. Да, если изменяются не-Eclipse-управляемые (maven) проекты (вне вашей рабочей области), то вам нужно запустить mvn build для их обновления.
- 3.3. Ключом к созданию этой работы является:
- 3.3.1 Развертывание проектов maven и Eclipse в репозиторий (моментальный снимок). Я использую http://www.sonatype.org/nexus/. Таким образом, когда вы запускаете maven, он ищет в хранилище nexus обновления для проектов maven и Eclipse.
- Некоторые другие заметки, которые уже могут быть очевидны:
- 4.1. Файл pom.xml должен содержать в качестве зависимостей только файлы, не относящиеся к Eclipse. (Плагин Tycho обрабатывает все зависимости Eclipse, которые должны быть найдены в вашем (nexus) хранилище.)
- 4.2. Добавьте зависимые файлы jar в среду выполнения в Eclipse (отредактировав среду исполнения plugin.xml)
Плагин Maven:
<plugin>
<!-- Copy non-Ecipse plugins to target/dependency so that may be referenced
for runtime use. -->
<artifactId>maven-dependency-plugin</artifactId>
<version>2.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<excludeGroupIds>org.XXX</excludeGroupIds>
</configuration>
</execution>
<execution>
<id>classpath</id>
<goals>
<goal>build-classpath</goal>
</goals>
<configuration>
<fileSeparator>/</fileSeparator>
<prefix>target/dependency</prefix>
<outputFile>${project.build.directory}/classPath.txt
</outputFile>
</configuration>
</execution>
</executions>
</plugin>
Пример build.properties
bin.includes = META-INF/,
target/classes/,
plugin.xml,
target/dependency/mongo-java-driver-2.11.3.jar
Пример манифеста (только подмножество банок):
Bundle-ClassPath: .,
target/classes/,
target/dependency/mongo-java-driver-2.11.3.jar
Официальная демонстрация действительно работает хорошо и показывает способ встраивания не OSGI-зависимостей или, другими словами, создает OSGI-фасад для других зависимостей.
На самом деле можно копировать зависимости вручную, сделать их частью манифеста OSGI и экспортировать пакеты, представляющие интерес.
Однако настоящая проблема заключается в выполнении плагина зависимостей в Eclipse.
Он просто не работает, даже с соответствующим разъемом M2E, таким образом блокируя обнаружение и разрешение пути класса PDE.
Вы можете попробовать maven-bundle-plugin с Embed-Dependency.
Смотрите http://wiki.eclipse.org/Tycho/How_Tos/Dependency_on_pom-first_artifacts
Официальная демонстрация работает хорошо. Тем не менее, мне все еще не удается использовать мой файл JAR таким образом.