gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 00:46:41 24 4
gpt4 key购买 nike

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

enter image description here

事实:

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

  • 问题:
  • 我不知道在哪个pom.xml中包含第三方依赖性。
  • 我不能将它们包括在RCP项目中,因为该pom的包装是eclipse-plugin,而不是jar。据我所知,如果将包装更改为jar,则会自动添加“Maven Dependencies”库。如果我改回eclipse-plugin,它们将被删除。

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

  • 相关解决方案:
  • “更新项目”不起作用,其他SO问题中的n个其他解决方案也不起作用。
  • 还有this questionthat question,但我没有完全得到答案
  • 最佳答案

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

    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的复杂库,这些库通常通过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文件只是带有<packaging>jar</packaging>的标准Maven pom文件,该文件声明引入Jersey 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的一部分。

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

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

    因此,这有点困惑,但这是几年前我们遇到这个问题时发现的最佳解决方案。我不确定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 bundle 在其libs文件夹中。 (如果您真的想这样做,请询问。我们也有一个案例,我们也必须这样做。我可以提供我们在开发和构建过程中要执行的步骤,以使其正常工作。我认为,单个项目的解决方法我上面提供的内容对您的情况更有意义。)
  • 为这个RCP应用程序创建一个单独的插件和功能真的是很多好习惯吗?答:这确实是一个单独的问题。如果您具有包含多个插件的功能,那么您将遇到相同的问题。 Tycho可以处理产品/功能/插件,但无法跳入基于Maven的依赖关系解析。您最终将不得不使用相同的解决方法

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

    关于java - 在Eclipse RCP Tycho应用程序中使用第三方库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35346113/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com