繁体   English   中英

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

[英]Using third-party libraries in Eclipse RCP Tycho app

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

在此输入图像描述

事实:

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

问题:

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

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

问题:

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

相关解决方案

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

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

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

只需将插件添加到pom依赖项中,并在target-platform-configuration的配置中包含条目<pomDependencies>consider</pomDependencies> ,即可使用它。

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

参考链接在这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM