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

GGrec:

我已经按照vogella广泛的Tycho教程创建了一个样板项目。

在此处输入图片说明

事实:

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

问题:

  • 我不知道该在哪pom.xml添加第三方依赖性。

  • 不能将它们包括在RCP项目中,因为该pom的包装是eclipse-plugin,而不是jar从我发现的情况来看,如果将包装更改为jar,则会自动添加“ Maven Dependencies”库。如果我改回到eclipse-plugin,它们将被删除。

问题:

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

相关解决方案:

  • “更新项目”不起作用,其他SO问题中的其他解决方案也不起作用。
  • 还有一个问题那个问题,但是我没有完全得到答案
汤姆·布莱恩(Tom Bryan):

我认为您有一个基本的误解。

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

第谷:问题是,Eclipse已经基于产品文件,feature.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项目中。在我的项目中,我们通过Jersey JAX-RS实现解决了这个问题。没有p2存储库,其中包含库的所有部分作为具有正确依赖性信息的插件。

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

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

<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>

实际上,我们最终不时用手运行带有该pom的Maven来更新库,然后我们将插件及其所有从属JAR都检查到了源代码控制中。 稍后检查构建,我发现实际上在开始构建的Maven / Tycho部分之前,我们用一个单独的构建任务实时用Maven填充了libs文件夹。当然,插件的MANIFEST-MF文件的Bundle-ClassPath和Export-Package条目直接来自源代码控制。我们必须不时检查这些内容,以确保它们与我们从Maven获得的库和软件包匹配。(除非我们改进主要的库版本或在Maven级别添加新的依赖项,否则这不会发生太大变化。)插件的build.properties将libs /文件夹作为bin.includes的一部分。

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

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

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

您的问题

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章