【问题标题】:Dependencies from pom.xml not considered by Eclipse in Tycho ProjectEclipse 在 Tycho 项目中未考虑 pom.xml 的依赖项
【发布时间】:2012-09-10 16:25:08
【问题描述】:

我创建了一个带有 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-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 的依赖关系?

【问题讨论】:

    标签: eclipse maven tycho


    【解决方案1】:

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

    运行mvn eclipse:eclipse

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

    【讨论】:

    • 这几乎可以解决我遇到的所有问题。剩下的唯一问题是,在清单中,捆绑包 com.springsource.org.testng 仍被标记为不可解析,即使它现在列在项目资源管理器中的引用库下。
    • 尝试使用 F5 刷新所有内容并清理 Eclipse 中的所有项目。项目 -> 清理...
    • 问题依然存在。即使在将项目作为现有项目删除并重新导入之后。
    • 尝试简单地删除清单。没有文件-没问题:)
    • 我猜你必须安装这个包,这样 Eclipse 也能看到它。 Maven 是一个独立的构建工具。它对 Eclipse 一无所知。同样代表 Eclipse。默认情况下,它对 Maven 依赖项一无所知。将这两者结合在一起通常非常痛苦。
    【解决方案2】:

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

    • 首先,将您的 POM 依赖项聚合到一个 p2 存储库中。为此,您需要一个 eclipse-feature 和一个 eclipse-repository 模块,以及一个单独的父 POM,该 POM 列出 POM 依赖项并配置 pomDependencies=consider
    • 在第二个构建中,将第一个构建中的 p2 存储库添加到 target platform,例如通过指向本地 Maven 存储库中构建结果的 jar:file: URL。

    然后,您还可以在 Eclipse 中配置您的目标平台,以包含第一次构建中的 p2 存储库(这取决于您当前的配置方式)。如果您使用所谓的目标定义文件,您将在 Tycho 和 Eclipse 之间获得最佳一致性,您可以将其用作 Eclipse 和 Tycho 中的目标平台。

    我知道所有这一切都需要付出相当大的努力来设置,但是 AFAIK 没有更好的解决方案可以完全发挥作用。

    【讨论】:

    • 难道不能有另一个父级,包括第一个构建和第二个构建作为模块?反应堆构建顺序应该首先构建eclipse-repository,您不需要第二次构建。
    • 这是另一种选择:在同一个反应器中构建eclipse-repository,并且仅将其用于Eclipse 中的目标平台。如果您不打算在 Eclipse 和 Tycho 之间共享目标定义文件,这是最简单的方法。
    • 我接受这个答案,因为这也解决了在 Eclipse 中工作时清单中的错误问题。但目前我会选择 Funtiks 的答案。
    • 我觉得这些答案不符合 Eclipse 构建的精神。不应该有使用maven构建Eclipse项目的外部构建工具吗?
    【解决方案3】:

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

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

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

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

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

    没那么难,有一个 Peter 写的‘bnd’工具 可以将您的罐子变成捆绑包的 Kriens。还有一个 Eclipse RCP提供的可以生成P2站点的便捷工具 (虽然以一种麻烦而痛苦的方式)。这两种工具都假设所有 您的 jars/bundles 位于本地文件夹中 - 这意味着您 必须手动下载它们。您可以使用 Maven 将其自动化 有点,但是Maven的方式有很大的不同 计算依赖树,这并不总是兼容 OSGi 方式(即问题编号#3)。让我们详细说明一下 多一点。

    它允许您定义一个 pom 打包的项目,该项目将解决所有 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>
    

    附:我通常不会发布旧问题和已回答问题的答案,但就我而言,我花了很长时间才以一种干净优雅的方式解决这个问题,所以我决定写下它。此外,该解决方案已于 2013 年底出现。

    【讨论】:

    • 如果有人要使用这个插件:较新的版本是:1.1.0
    • @jachinte 我的示例已经在使用1.1.1-SNAPSHOT。也许,你的意思是1.2.0-SNAPSHOT
    猜你喜欢
    • 1970-01-01
    • 2020-07-17
    • 2016-12-03
    • 2013-08-09
    • 2012-07-19
    • 2015-12-24
    • 2022-01-20
    • 2010-12-14
    • 2012-12-17
    相关资源
    最近更新 更多