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

时间:2016-02-11 17:29:47

标签: java maven eclipse-plugin eclipse-rcp tycho

我按照vogella广泛的Tycho教程创建了一个锅炉板项目。

enter image description here

的事实:

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

问题:

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

  • 不能将它们包含在RCP项目中,因为该pom的包装为eclipse-plugin,而不是jar。从我注意到的情况来看,如果我将包装改为jar,那么" Maven Dependencies"库自动添加。如果我更改回eclipse-plugin,则会将其删除。

的问题:

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

相关解决方案:

  • "更新项目"不起作用,其他SO问题中的其他解决方案也没有。
  • 还有this questionthat question,但我没有完全得到答案

2 个答案:

答案 0 :(得分:16)

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

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

Tycho :问题是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的复杂库包含在内,这些JAR通常是通过Maven分发并包含在标准Java项目中的。我们在项目中使用Jersey JAX-RS实现了这个问题。没有p2存储库,它包含所有库作为具有正确依赖关系信息的插件。

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

变通方法/解决方案:在我们的案例中,Jersey JAX-RS不能作为Eclipse插件使用,它有一堆传递依赖项。解决方法是创建一个Eclipse&#34;库插件&#34;就像我上面提到的两个pom文件一样。我们最初使用 empty libs文件夹创建了一个框架插件。一个pom文件只是一个带有<packaging>jar</packaging>的标准Maven pom文件,它声明了引入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>

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

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

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

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

您的问题

  • 我在哪里添加依赖项?我的项目中没有包含jar包装的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插件无法看到&#34;&#34;一个裸JAR库。插件需要将库包含在其本地libs文件夹中(在MANIFEST.MF中具有匹配的Bundle-ClassPath条目),或者它需要依赖于导出相应包的其他插件。 Tycho只是通过Eclipse插件解决了依赖关系,它无法直接利用普通的Maven依赖解析来引入一堆JAR。如果所有依赖项都已经插件,那么你很好。如果没有,您可能必须使用上面的解决方法来为您的插件打包一组库以供使用。

答案 1 :(得分:0)

只需将插件添加到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>

参考链接here