Eclipse在Tycho Project中未考虑pom.xml中的依赖关系

我使用eclipse-plugin包装创建了一个Tycho项目。 该项目包含一些通过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是:

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 Nature。 我是否错过了一些东西,以便Eclipse Juno也会考虑pom的依赖关系?


您可以绕过将您的项目构建分解为两部分的问题:

  • 首先,将您的POM依赖关系集成到一个p2存储库中。 您需要一个eclipse-feature和一个eclipse-repository模块,另外还有一个单独的父POM,它列出了POM的依赖关系并配置了pomDependencies=consider
  • 在第二个版本中,将第一个版本的p2存储库添加到目标平台,例如通过指向本地Maven存储库中构建结果的jar:file: URL。
  • 然后,您还可以在Eclipse中配置您的目标平台,以便在第一次构建中包含p2存储库(这取决于您当前如何配置它)。 如果您使用所谓的目标定义文件,则可以在Tycho和Eclipse之间获得最佳的一致性,您可以在Eclipse和Tycho中将它们用作目标平台。

    我知道所有这些工作都是相当努力的,但是AFAIK没有更好的解决方案可以完全发挥作用。


    maven-RCP问题之间存在的所有问题的最优雅的解决方案是使用p2-maven-plugin 。 以下是这些问题的简要总结(从上面的链接中删除):

    为了向Eclipse RCP项目添加第三方依赖项,依赖关系必须驻留在P2更新站点中。

    Eclipse(和其他提供者)提供了一组公共更新站点,但显然不是所有流行和公开可用的依赖关系都存在(这是#1号问题)。

    由于Eclipse RCP是一个OSGi环境,为了向p2更新站点添加依赖关系,dependency必须是一个OSGi bundle(这是#2的问题)。

    所以,现在我们来总结一下:我们所有的工件必须是OSGi捆绑包,但它们并不总是捆绑在一起,它们必须位于P2站点中,但我们没有该站点。 我们如何继续?

    这并不困难,Peter Kriens写的一个'bnd'工具可以将你的罐子变成捆。 Eclipse RCP还提供了一个便利工具,可以生成P2站点(尽管如此繁琐而痛苦)。 这两种工具都假定所有的jar / bundles都位于本地文件夹中 - 这意味着您必须手动下载它们。 您可以使用Maven将它自动化一下,但Maven如何计算依赖树的方式存在显着差异,并且这与OSGi方式(这是问题编号#3)不兼容。 让我们再详细阐述一下。

    它允许你定义一个可以解析所有Maven依赖项的pom打包项目,将所有非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>
    

    PS我通常不会回答旧的和回答的问题,但在我的情况下,花了这么长的时间才以清晰优雅的方式解决这个问题,所以我决定写这个问题。 此外,该解决方案已于2013年底出现。


    从命令行导航到pom.xml所在的文件夹。

    运行mvn eclipse:eclipse

    这应该建立一个有效的eclipse项目。

    链接地址: http://www.djcxy.com/p/52313.html

    上一篇: Dependencies from pom.xml not considered by Eclipse in Tycho Project

    下一篇: Cannot resolve Mockito dependency in a Tycho project