Обработка зависимостей не-OSGi при интеграции Maven, Tycho и Eclipse

У меня есть куча плагинов на основе Eclipse, которые я переносил в Maven/Tycho. Большинство этих плагинов зависят от отдельных библиотек, которыми я сейчас управляю через Maven, а не путаются с .jar файлы.

Самая громоздкая часть моей текущей настройки связана с явной неспособностью Tycho обрабатывать артефакты только для Maven (т.е. не OSGi). Моя текущая настройка работает так:

  1. в pom.xml каждого плагина Eclipse я выпускаю unpack цель maven-dependency-plugin в течение initialize фаза. Это распаковывает артефакты, которые я указываю в отдельный target/dependencies каталог.

  2. target/dependencies каталог добавляется как выходной каталог в build.properties, так что Tycho может добавить его в classpath при компиляции:

    source.. = src/main/java/
    output.. = target/classes/
    output.. = target/dependencies/
    
  3. 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).

  1. Для распаковки зависимостей я использую плагин maven-dependency-plugin, чтобы поместить их в цель / зависимость (см. Ниже).
    • 1.1. copy-зависимости делают то, что нужно без распаковки.
  2. Ваш источник и результаты примерно такие же, как у меня.
    • 2.1. Да, mvn должен инициализировать цель / зависимости
  3. Я включаю только необходимые банки в манифест, потому что 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. Некоторые другие заметки, которые уже могут быть очевидны:
    • 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 таким образом.

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