Зависимости от 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.