当前位置: 首页 > 知识库问答 >
问题:

Tycho项目中Eclipse不考虑pom.xml的依赖性

空正豪
2023-03-14

我创建了一个带有 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]"

该项目仅包含默认包中的一个类,该类使用来自< code > org . TestNG . annotations 的注释来测试编译期间是否包含依赖项。

如果我使用Maven 3.0.4在命令行上构建项目,一切正常。在Eclipse Juno中导入项目后,我收到了多个错误。最重要的一个是清单,它指出bundlecom.springsource.org.testng无法解析。类中还有一个编译错误,因为注释的导入是不可能的。该项目配置了Maven自然。我是否错过了一些东西,以便Eclipse Juno也会考虑pom的依赖项?

共有3个答案

袁运良
2023-03-14

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

运行<code>mvn eclipse:eclipse</code>。

这应该会生成一个有效的日食项目。

傅宏恺
2023-03-14

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

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

Eclipse(和其他提供商)提供了一组公共更新站点,但是显然不是所有流行的和公共可用的依赖项都在那里(这是问题1)。

由于Eclipse RCP是一个OSGi环境,以便向p2更新站点添加依赖项,因此depenedncy必须是OSGi捆绑包(这是问题编号#2)。

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

这并不困难,有一个由Peter Kriens编写的“bnd”工具可以将你的jar转换成bundles。Eclipse RCP还提供了一个方便的工具,可以生成一个P2站点(尽管这种方式既麻烦又痛苦)。这两个工具都假设您所有的jar/bundle都位于本地文件夹中——这意味着您必须手动下载它们。您可以使用Maven来稍微自动化一下,但是Maven计算依赖关系树的方式有很大的不同,这并不总是与OSGi的方式兼容(这是第三个问题)。让我们再详细阐述一下。

它允许您定义一个 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年底出现。

淳于健
2023-03-14

您可以通过将项目构建分成两部分来解决这个问题:

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

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

我知道,所有这一切是相当多的努力来建立,但没有更好的解决方案,充分工作。

 类似资料:
  • 我有一个使用Spring的项目。它使用的是3.1.1版本,但是,由于某些原因,我真的不知道,有些spring工件与两个不同的版本是重复的。我在项目中的所有pom.xml文件中查找这些依赖项。我还使用dependecy插件来找出那些依赖项包含在哪里。 这里有输出的提取 据我所知,这意味着包含在中。 更新:似乎当我评论下一段代码时,罐子不包括在战争中。

  • 问题内容: 这个问题是关于Eclipse开发的,我试图在Eclipse中创建一个Web应用程序,问题是我没有将依赖项jar保存到已部署的归档文件中。 我创建了一个新的动态Web项目,并将其链接到另一个Java项目。Java项目引用了一些第3方jar(例如Spring jar),但是由于某些原因,在发布Web项目时,我在战争的lib目录中仅得到Java项目jar,而没有Java项目依赖项(例如Spr

  • 值得说的是,当我在Eclipse内部运行单元测试时(而不是在Maven中),它是有效的。 这是我测试片段中的第谷配置: 正如这里所建议的,我将这个特性作为一个依赖项添加,因为我的测试片段除了它的主机之外还需要一些其他的包,所以我希望这能起作用。

  • 我们用Maven和Tycho构建了一个Eclipse插件。然而,目前我们仍然通过一堆手动添加的JAR文件而不是Maven来提供所有的项目依赖。这是由于以下原因:(1)依赖项不能通过标准的Eclipse更新站点获得(至少不能在当前版本中获得),(2)依赖项不能作为捆绑包获得。 这些依赖项中最大的部分是Selenium库(API,远程,特定于浏览器的库及其传递依赖项,例如Guava等)。 我浪费了几个

  • 我有一个Tycho构建,它为Xtext DSL功能生成eclipse插件。我现在想做一个maven插件,它可以处理DSL文件。问题是要将DSL插件所依赖的工件放入maven插件中,因为这些工件不在maven存储库中。此外,我希望maven插件自动依赖于DSL插件所依赖的相同工件。 我认为创建一个带有依赖项的 über-jar 将是最好的方法。问题是检索 DSL 插件的依赖项并将其复制到一个目录中,

  • 我试图通过从eclipse workspace项目导入现有maven项目来创建maven项目,但eclipse无法解决任何依赖项。每次创建项目、更新maven依赖项或清理项目时,依赖项会被下载,但它们不会从本地maven存储库中被引用。当我从命令行运行时生成构建 我已经筋疲力尽地尝试解决这个问题的所有修补程序了,比如启用索引、清理项目、Maven->update project 我的eclipse