在 Eclipse RCP Tycho 应用程序中使用第三方库

2022-09-04 01:18:53

我按照vogella广泛的第谷教程创建了一个样板项目。

enter image description here

事实:

  • 没有功能,也没有插件。唯一的插件是RCP应用程序,它也是入口点。

问题:

  • 我不知道我在哪些地方包含第三方依赖项。pom.xml

  • 我不能将它们包含在RCP项目中,因为该pom的包装是,而不是。根据我所注意到的,如果我将打包更改为 ,则会自动添加“Maven 依赖项”库。如果我改回 ,它们将被删除。eclipse-pluginjarjareclipse-plugin

问题:

  • 在哪里添加依赖项?在我的项目中没有带有包装的pom。jar
  • 我应该使用必要的 JAR 创建一个单独的项目吗?如何将该依赖项包含在我的整个项目中?
  • 为此RCP应用程序创建单独的插件和功能真的是一种很好的做法吗?

相关解决方案:

  • “更新项目”不起作用,其他 SO 问题中的 n 个其他解决方案也不起作用。
  • 还有这个问题那个问题,但我没有完全得到答案

答案 1

我认为你有一个根本的误解。

Maven:Maven 通过 pom.xml确定所有项目依赖项,并自动解析可传递依赖项(假设所有 pom 文件和工件都存在于您配置的存储库中,并正确声明其依赖项)。

Tycho:问题在于 Eclipse 已经有了自己的基于产品文件、功能.xml文件和插件 MANIFEST 的项目模型。MF 文件。Tycho 在 Eclipse 中利用了 Maven 机制,但这个想法是 pom.xml 文件只需配置 Maven 插件并声明打包类型。这为Maven提供了一个切入点,但随后Tycho接管了。虽然 Maven 通常根据 pom.xml 文件中的信息构建依赖关系链,但 Tycho 正在从产品、功能和 MANIFEST 中的信息构建依赖关系更改。MF 文件。您不会在 pom.xml 文件中放置任何依赖项。Tycho 还使用 Eclipse p2 存储库(而不是普通的 Maven 存储库)来查找在本地模块或目标平台中找不到的依赖插件。

对于许多 Eclipse 开发人员来说,这实际上是一个好处,因为他们已经在 Eclipse 插件、功能和产品中正确设置了所有内容。他们不希望必须重复 pom.xml中的所有依赖项。

在 Eclipse 插件中使用库:在 Eclipse 中,如果要使用尚未打包为 Eclipse 插件的库,则有几个选项。您的插件可以在 libs 文件夹中包含一组 JAR,然后将该 libs 文件夹包含在插件和运行时类路径中(请参阅 build.properties 文件)。另一种选择是创建您自己的“库插件”,将JAR库重新打包为Eclipse插件。另请参见 https://wiki.eclipse.org/FAQ_What_is_the_classpath_of_a_plug-in%3F。这就是你得到的答案。

问题是,如果您尝试包含一个具有多个 JAR 的复杂库,该库通常通过 Maven 分发并包含在标准 Java 项目中。我们在我的项目中的泽西 JAX-RS 实现中遇到了这个问题。没有 p2 存储库将所有库部分作为插件包含,并具有正确的依赖项信息。

简单的解决方案:如果您需要一个通用库,请先检查 Orbit 项目,看看这些库是否已打包为 Eclipse 插件,http://www.eclipse.org/orbit/。在这种情况下,您可以下载它们并将它们包含在目标平台中,也可以在(Tycho)构建时从其p2存储库中动态拉入它们。您的插件将仅将这些插件作为依赖项包含在内(在其 MANIFEST 中。MF 文件)。

解决方法/解决方案:在我们的例子中,Jersey JAX-RS不能作为Eclipse插件使用,它有一堆传递依赖关系。解决方法是创建一个 Eclipse“库插件”,就像我上面提到的两个 pom 文件一样。我们最初创建了一个带有 libs 文件夹的框架插件。一个 pom 文件只是一个标准的 Maven pom 文件,它声明了拉入 Jersey JAX-RS 实现及其所有依赖项所需的顶级依赖项。依赖项使用 声明。我们使用 maven-dependency-plugin 将所有这些依赖项复制到项目的 libs 文件夹中。<packaging>jar</packaging><scope>compile</scope>

<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
        <execution>
            <id>copy-dependencies</id>
            <phase>compile</phase>
            <goals>
                <goal>copy-dependencies</goal>
            </goals>
            <configuration>
                <outputDirectory>libs</outputDirectory>
            </configuration>
        </execution>
    </executions>
</plugin>

实际上,我们最终不时地手动运行Maven来更新库,然后我们只是将插件及其所有依赖的JAR检查到源代码管理中。稍后检查构建,我看到我们实际上在启动构建的Maven /Tycho部分之前,使用Maven动态填充了Maven的libs文件夹,并执行了单独的构建任务。当然,插件的 MANIFEST-MF 文件的 Bundle-ClassPath 和 Export-Package 条目直接来自源代码管理。我们必须不时检查这些,以确保它们与我们从Maven获得的库和包相匹配。(这通常不会有太大变化,除非我们碰到主要的库版本或在Maven级别添加新的依赖项。插件的 build.properties 将 libs/ 文件夹作为 bin.include 的一部分。

在开发环境中,在我们首先签出代码后,我们只需在项目的“复制依赖项”pom 文件上运行 mvn(使用外部工具启动配置,该配置也与项目一起签入)。这将用所有 JAX-RS 库和依赖项填充 libs 文件夹。我们只需要在更新有关依赖项的内容时,或者当我们在具有不同版本的 JAX-RS 依赖项的分支之间跳转时,才需要再次运行它。我们设置 .gitignore 来确保我们不会将库提交到 Git。

此项目的另一个 pom 的设置类似于普通的 Tycho pom 文件。在我们的自动构建期间,我们在构建过程的早期(就在签出之后)运行一个步骤,使用jar pom调用mvn来填充库。然后,我们使用 eclipse 插件 pom 继续进行主要的 Maven/Tycho 构建。eclipse-plugin pom 没有依赖信息(正如我上面所说)。它只是为Tycho提供了一种识别Eclipse插件并基于其MANIFEST构建它的方法。MF 和 build.properties 文件。但是,内置的插件包含并公开了由 mvn 调用 jar pom 步骤填充的所有库。<packaging>eclipse-plugin</packaging>

所以,这有点混乱,但这是我们几年前遇到这个问题时发现的最佳解决方案。我不确定Tycho是否正在做任何工作来允许某种混合的Maven /Tycho构建,这些构建可以作为构建的一部分自动执行此操作。我想我应该问问开发人员。:)

您的问题

  • 在哪里添加依赖项?在我的项目中没有带有罐子包装的pom。答:上面的解决方法允许您使用一个项目来执行此操作。你只有两个 pom 文件,比如 pom_deps.xml 和 pom.xml。您只需要单独调用pom_deps.xml来填充libs文件夹(在开发环境中和自动构建中)。
  • 我应该使用必要的 JAR 创建一个单独的项目吗?如何将该依赖项包含在我的整个项目中?答:我上面描述的解决方法允许您使用单个项目执行此操作。另一种方法是创建一个单独的JAR项目,但我不认为你的Eclipse RCP应用程序真的可以以有用的方式包含一个模块。我发现这样做的唯一方法是使用类似的解决方法。首先构建 JAR 模块,将其安装到 maven 存储库中,然后让其中一个插件项目将 JAR 捆绑在其 libs 文件夹中。(如果你真的想这样做,问问。我们有一个案例,我们也必须这样做,我可以提供我们在开发和构建中所做的步骤,以使其正常工作。我认为我上面提供的单个项目解决方法对您的情况更有意义。<packaging>jar</packaging>
  • 为此RCP应用程序创建单独的插件和功能真的是一种很好的做法吗?答:这实际上是一个单独的问题。如果您的某个功能具有多个插件,则会遇到同样的问题。Tycho可以处理产品/功能/插件,但它不能跳转到基于Maven的依赖关系解决方案。您最终将不得不使用相同的解决方法

简介: 根本问题是 Eclipse 插件无法“看到”裸露的 JAR 库。插件需要将库包含在其本地 libs 文件夹中(在 MANIFEST 中具有匹配的 Bundle-ClassPath 条目)。MF),或者它需要依赖于导出相应包的其他插件。Tycho只是通过Eclipse插件解析依赖关系,它不能直接利用正常的Maven依赖关系解析来拉入一堆JAR。如果所有依赖项都已是插件,则没问题。如果没有,您可能需要使用上述解决方法打包一组库以供插件使用。


答案 2

只需将插件添加到 pom 依赖项中,并在 配置中包含该条目即可使其正常工作。<pomDependencies>consider</pomDependencies>target-platform-configuration

<plugins>
    <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>target-platform-configuration</artifactId>
        <version>${tycho.version}</version>
        <configuration>
            <!-- The configuration to make tycho consider the maven dependencies -->
            <pomDependencies>consider</pomDependencies> 
            <!-- other configurations -->
        </configuartion>
    </plugin>
    <!-- other plugins-->
</plugins>
<dependencies>
    <!-- An example third-party bundle (plugin) present in maven repository-->
    <dependency>
        <groupId>org.apache.felix</groupId>
        <artifactId>org.apache.felix.gogo.shell</artifactId>
        <version>1.1.0</version>
    </dependency>
</dependencies>

此处为参考链接。


推荐