Tycho项目中Eclipse未考虑来自pom.xml的依赖项

Tycho项目中Eclipse未考虑来自pom.xml的依赖项,eclipse,maven,tycho,Eclipse,Maven,Tycho,我用eclipse插件打包创建了一个Tycho项目。该项目包括一些通过pom.xml指定的依赖项。相关pom章节包括: UTF-8 0.15.0 src org.eclipse.tycho tycho maven插件 ${tycho.version} 真的 org.eclipse.tycho 目标平台配置 ${tycho.version} 考虑 win32 win32 x86 linux gtk x86_64 马科斯 热可可 x86_64 朱诺 p2 http://download.eclip

我用
eclipse插件
打包创建了一个Tycho项目。该项目包括一些通过pom.xml指定的依赖项。相关pom章节包括:


UTF-8
0.15.0
src
org.eclipse.tycho
tycho maven插件
${tycho.version}
真的
org.eclipse.tycho
目标平台配置
${tycho.version}
考虑
win32
win32
x86
linux
gtk
x86_64
马科斯
热可可
x86_64
朱诺
p2
http://download.eclipse.org/releases/juno
com.springsource.repository.bundles.release
SpringSource企业捆绑包存储库-SpringSource捆绑包版本
http://repository.springsource.com/maven/bundles/release
com.springsource.repository.bundles.external
SpringSource企业捆绑包存储库-外部捆绑包版本
http://repository.springsource.com/maven/bundles/external
org.testng
com.springsource.org.testng
6.4.0
com.google.guice
com.springsource.com.google.inject
2.0.0
org.aopalliance
com.springsource.org.aopalliance
1.0.0
舱单是:

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在命令行上构建项目,那么一切都正常。在EclipseJuno中导入项目后,我得到了多个错误。最重要的是在清单中,它声明bundle
com.springsource.org.testng
无法解析。类中还有一个编译错误,因为无法导入注释。该项目配置了Maven特性。我是否丢失了一些东西,以便Eclipse Juno也会考虑从命令行导航到POM.XML所在的文件夹的POM?

< P>的依赖关系。

运行
mvneclipse:eclipse


这将生成一个有效的eclipse项目。

您可以通过将项目构建分为两部分来避免此问题:

  • 首先,将POM依赖项聚合到p2存储库中。为此,您需要一个
    eclipse特性
    和一个
    eclipse存储库
    模块,以及一个单独的父POM,该POM列出POM依赖项并配置
    pomDependencies=consive
  • 在第二个构建中,将p2存储库从第一个构建添加到,例如,通过指向本地Maven存储库中的构建结果的
    jar:file:
    URL
然后,您还可以在Eclipse中配置目标平台,以包含第一次构建的p2存储库(这取决于您当前如何配置它)。如果使用所谓的目标定义文件,您将在Tycho和Eclipse之间获得最佳的一致性,您可以在Eclipse和Tycho中将其用作目标平台


我知道所有这些都需要花费相当多的精力来设置,但恐怕没有更好的解决方案可以完全发挥作用。

解决maven RCP问题之间存在的所有问题的最优雅的解决方案是使用 . 以下是这些问题的简要总结(摘自上述链接):

为了向EclipseRCP项目添加第三方依赖项 依赖项必须驻留在P2更新站点中

Eclipse(和其他提供商)提供了一组公共更新站点, 但显然,并非所有流行的和公开可用的依赖项都是可用的 这就是问题编号#1)

由于EclipseRCP是一个OSGi环境,因此需要添加依赖项 对于p2更新站点,dependency必须是一个OSGi包(即 问题编号#2)

现在让我们总结一下:我们所有的工件都必须是OSGi包, 但它们并不总是捆绑的,它们必须位于P2中 网站,但我们没有那个网站。那我们怎么办呢

这并不难,有一个由Peter编写的“bnd”工具 Kriens可以将您的罐子转换成捆。还有一个 EclipseRCP提供的方便工具,可以生成P2站点 (尽管是以一种笨拙而痛苦的方式)。这两种工具都假设 您的jar/bundle位于本地文件夹中,这意味着您 必须手动下载。您可以使用Maven将其自动化 位,但在Maven的工作方式上有显著差异 计算依赖关系树,但这与 OSGi方式(即问题编号#3)。让我们详细说明一下 再多一点

它允许您定义一个pom打包项目,该项目将解析所有maven依赖项,将所有非OSGi依赖项转换为捆绑包,并从中生成p2站点

下面是完整的最小pom文件,包括对slf4j-log4j12的依赖关系(它隐式地依赖于slf4j和log4j v1.2):


4.0.0
别列佐夫斯基计划
p2
聚甲醛
1.0.0
org.reficio
p2maven插件
1.1.1-快照
默认cli
org.slf4j:slf4j-log4j12:1.7.7
org.mortbay.jetty
jetty maven插件
<?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>