Зависимости от pom.xml, не учтенные Eclipse в проекте Tycho

Я создал проект Tycho с упаковкой eclipse-plugin. Проект включает некоторые зависимости, которые задаются через pom.xml. Соответствующие разделы pom:

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <tycho.version>0.15.0</tycho.version>
</properties>
<build>
    <sourceDirectory>src</sourceDirectory>
    <plugins>
        <plugin>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>tycho-maven-plugin</artifactId>
            <version>${tycho.version}</version>
            <extensions>true</extensions>
        </plugin>
        <plugin>
            <groupId>org.eclipse.tycho</groupId>
            <artifactId>target-platform-configuration</artifactId>
            <version>${tycho.version}</version>
            <configuration>
                <pomDependencies>consider</pomDependencies>
                <environments>
                    <environment>
                        <os>win32</os>
                        <ws>win32</ws>
                        <arch>x86</arch>
                    </environment>
                    <environment>
                        <os>linux</os>
                        <ws>gtk</ws>
                        <arch>x86_64</arch>
                    </environment>
                    <environment>
                        <os>macosx</os>
                        <ws>cocoa</ws>
                        <arch>x86_64</arch>
                    </environment>
                </environments>
            </configuration>
        </plugin>
    </plugins>
</build>
<repositories>
    <repository>
        <id>juno</id>
        <layout>p2</layout>
        <url>http://download.eclipse.org/releases/juno</url>
    </repository>
    <repository>
        <id>com.springsource.repository.bundles.release</id>
        <name>SpringSource Enterprise Bundle Repository - SpringSource Bundle Releases</name>
        <url>http://repository.springsource.com/maven/bundles/release</url>
    </repository>
    <repository>
        <id>com.springsource.repository.bundles.external</id>
        <name>SpringSource Enterprise Bundle Repository - External Bundle Releases</name>
        <url>http://repository.springsource.com/maven/bundles/external</url>
    </repository>
</repositories>
<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>com.springsource.org.testng</artifactId>
        <version>6.4.0</version>
    </dependency>
    <dependency>
        <groupId>com.google.guice</groupId>
        <artifactId>com.springsource.com.google.inject</artifactId>
        <version>2.0.0</version>
    </dependency>
    <dependency>
        <groupId>org.aopalliance</groupId>
        <artifactId>com.springsource.org.aopalliance</artifactId>
        <version>1.0.0</version>
    </dependency>
</dependencies>

И манифест:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Plugin-project-pure
Bundle-SymbolicName: plugin-project-pure
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: org.eclipse.equinox.app,
 org.eclipse.uml2.uml;bundle-version="4.0.0",
 org.eclipse.uml2.uml.resources;bundle-version="4.0.0",
 org.junit;bundle-version="4.10.0",
 com.springsource.org.testng;bundle-version="[6.4.0,6.4.0]"

Проект состоит только из класса в пакете по умолчанию, который использует аннотацию из org.testng.annotations для проверки того, что во время компиляции включена зависимость.

Если я строю проект в командной строке с Maven 3.0.4, все работает отлично. После импорта проекта в Eclipse Juno я получаю несколько ошибок. Самый важный из них - в манифесте, и он утверждает, что пакет com.springsource.org.testng не может быть разрешен. В классе также есть ошибка компиляции, поскольку импорт аннотации невозможен. В проекте настроена конфигурация Maven. Я что-то упустил, чтобы Eclipse Juno также рассмотрел зависимости pom?

Ответ 1

Вы можете обойти эту проблему, разбив сборку проекта на две части:

Затем вы также можете настроить целевую платформу в Eclipse, чтобы включить репозиторий p2 из первой сборки (которая зависит от того, как вы сейчас настраиваете ее). Вы получите наилучшую согласованность между Tycho и Eclipse, если вы используете так называемый файл определения цели, который вы можете использовать как целевую платформу в Eclipse, так и в Tycho.

Я знаю, что все это довольно много усилий для настройки, но AFAIK нет лучших решений, которые полностью работают.

Ответ 2

Наиболее элегантным решением всех проблем, существующих между проблемами maven-RCP, является использование p2-maven-plugin. Вот краткий обзор этих проблем (вырезания из ссылки выше):

Чтобы добавить стороннюю зависимость к проекту RCP Eclipse, зависимость должна находиться на сайте обновления P2.

Eclipse (и другие поставщики) предоставляют набор сайтов общего обновления, но, очевидно, не все популярные и общедоступные зависимости там (номер проблемы №1).

Так как Eclipse RCP является средой OSGi, чтобы добавить зависимость на сайт обновления p2 depenedncy должен быть пакетом OSGi (то есть номер проблемы №2).

Итак, давайте подытожим сейчас: все наши артефакты должны быть пакетами OSGi, но они не всегда связки, и они должны быть расположены в P2 сайт, но у нас нет этого сайта. Как мы можем продолжить?

Это не так сложно, есть инструмент "bnd", написанный Питером Kriens, которые могут превратить ваши банки в пучки. Существует также удобный инструмент, предоставляемый Eclipse RCP, который может генерировать сайт P2 (хотя это громоздко и болезненно). Оба инструмента предполагают, что все ваши банки/пачки расположены в локальной папке, что означает, что вы придется загружать их вручную. Вы можете использовать Maven для автоматизации бит, но есть существенная разница в том, как Maven вычисляет дерево зависимостей, и это не совместимо с путь OSGi (это номер проблемы №3). Остановимся на бит больше.

Он позволяет вам определить пакетный проект, который будет разрешать все зависимости от maven, конвертировать все не-OSGi в пакеты и генерировать p2-сайт из них.

Ниже приведен полный минимальный файл pom, включающий зависимость от slf4j-log4j12 (что неявно зависит как от slf4j, так и от log4j v1.2):

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>me.berezovskiy.project</groupId>
  <artifactId>p2</artifactId>
  <packaging>pom</packaging>
  <version>1.0.0</version>
  <build>
    <plugins>
      <plugin>
        <groupId>org.reficio</groupId>
        <artifactId>p2-maven-plugin</artifactId>
        <version>1.1.1-SNAPSHOT</version>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              <artifacts>
                <artifact>
                  <id>org.slf4j:slf4j-log4j12:1.7.7</id>
                </artifact>
              </artifacts>
            </configuration>
          </execution>
        </executions>
      </plugin>
      <plugin>
        <groupId>org.mortbay.jetty</groupId>
        <artifactId>jetty-maven-plugin</artifactId>
        <version>8.1.12.v20130726</version>
        <configuration>
          <scanIntervalSeconds>10</scanIntervalSeconds>
          <webAppSourceDirectory>${basedir}/target/repository/</webAppSourceDirectory>
          <webApp>
            <contextPath>/site</contextPath>
          </webApp>
        </configuration>
      </plugin>
    </plugins>
  </build>
  <pluginRepositories>
    <pluginRepository>
      <id>reficio</id>
      <url>http://repo.reficio.org/maven/</url>
    </pluginRepository>
  </pluginRepositories>
</project>

P.S. Обычно я не отправляю ответы на старые и ответы на вопросы, но в моем случае потребовалось так много времени, чтобы решить эту проблему чистым и элегантным способом, который я решил написать об этом. Кроме того, решение появилось в конце 2013 года.

Ответ 3

из командной строки перейдите к папке, где находится pom.xml.

Запустите mvn eclipse:eclipse.

Это должно создать действительный проект eclipse.