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

GGr*_*rec 12 java eclipse-plugin eclipse-rcp tycho maven

我根据vogella广泛的Tycho教程创建了一个锅炉板项目.

在此输入图像描述

事实:

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

问题:

  • 我不知道在哪些内容中pom.xml包含第三方依赖项.

  • 不能将它们包含在RCP项目中,因为那个pom的包装是eclipse-plugin,而不是jar.根据我的注意,如果我将包装更改为jar,则会自动添加"Maven Dependencies"库.如果我改回去eclipse-plugin,他们会被删除.

问题:

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

相关解决方案

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

Tom*_*yan 17

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

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"库插件",就像我上面提到的两个pom文件一样.我们最初创建了一个带有 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>
Run Code Online (Sandbox Code Playgroud)

实际上,我们不时用手工运行Maven来更新lib,然后我们只是检查插件及其所有依赖的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以确保我们不将lib提交给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文件构建它.但是,内置的插件包含并公开了所有那些由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插件无法"看到"裸JAR库.插件需要将库包含在其本地libs文件夹中(在MANIFEST.MF中具有匹配的Bundle-ClassPath条目),或者它需要依赖于导出相应包的其他插件.Tycho只是通过Eclipse插件解决了依赖关系,它无法直接利用普通的Maven依赖解析来引入一堆JAR.如果所有依赖项都已经插件,那么你没问题.如果没有,您可能必须使用上面的解决方法来为您的插件打包一组库以供使用.