最近,我开始与团队合作开发Eclipse插件。 团队开发了一个很棒的插件,可以实现预期的目的。 因此,我签出了源并尝试构建它。 项目源包含所有必需的库,并且只能在Eclipse中构建。 在当今不断交付的世界中,这是一个主要障碍,因为无法在詹金斯上建立这样的项目。 该项目不仅包含必需的库,而且完整的eclipse设置也保留为源代码的一部分,因此我想先进行改进。 我在项目中创建了POM.xml并删除了设置和库。 构建工作正常,但是当我在Eclipse中打开项目时,情况一团糟。 那里什么都没做!
花了一段时间才意识到Eclipse和Maven是两个不容易融合的世界。 甚至最小的东西(如工件版本和Bundle版本)也不会轻易收敛。 在Maven中,任何东西都可以是版本,例如21快照。 但是在日食中有一些标准,它必须命名为[number]。[number]。[number] .qualifier,例如1.1.21.qualifier。
为了弥合两个世界之间的鸿沟,Sonatype已将Tycho贡献给了Eclipse生态系统。 将插件添加到eclipse存储库中:
<repository>
<id>juno</id>
<layout>p2</layout>
<url>http://download.eclipse.org/releases/juno</url>
</repository><plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>tycho-versions-plugin</artifactId>
<version>0.18.1</version>
</plugin><plugin>
<groupId>org.eclipse.tycho</groupId>
<artifactId>target-platform-configuration</artifactId>
<version>0.18.1</version>
<configuration>
<pomDependencies>consider</pomDependencies>
<environments>
<environment>
<os>linux</os>
<ws>gtk</ws>
<arch>x86_64</arch>
</environment>
</environments>
</configuration>
</plugin>
这里有几点要注意:
- 如果该插件用于特定的Eclipse平台,则应添加该插件的存储库。
- 该插件可以使用来自POM或MANIFEST.MF的依赖项。 如果从POM使用依赖项,则设置pomDependencies
Tycho插件还带来了一组用于版本更新,surefire测试等的插件。可以单独调用这些插件以执行不同的目标,例如,可以通过以下方式使用版本插件来设置版本:
mvn tycho-versions:set-version -DnewVersion=1.1.1-SNAPSHOT
这将在POM中设置1.1.1-SNAPSHOT版本,在MANIFEST.MF中设置1.1.1.qualifier。
尽管插件提供了很多功能,但也有一些限制。 插件无法为PDE生成正确的日食设置。 因此,如果我们不保留这些设置,则需要再次生成这些设置。 插件页面上没有列出其他限制。
在此之后,我们现在已经能够在某种意义上弥合两个世界。 生成Eclipse插件的Maven构建是可能的。
插件类加载器
在Eclipse PDE中,有插件和片段。 插件是提供功能的完整模块,片段是将自身附加到父插件然后增强其功能的模块。 因此,插件可以附加n个片段,从而在运行时对其进行增强。
我们有一个基础插件,它提供了一些基本功能,并且在其上构建了一个片段以在插件中使用Hadoop1.x。 一段时间后,要求也支持Hadoop2.x。 现在,这两个库彼此不兼容。 因此,需要一些解决方法来启用此功能
幸运的是,基于OSGI的Eclipse与其他Java应用程序相比,具有不同的类加载机制。 通常,只有一个/层次结构类加载器可以加载整个应用程序。 现在,在这种情况下,如果将两个不兼容的jar捆绑在一起,则只会加载一个。 但是在eclipse中,每个插件都有自己的类加载器,可以加载自己的类。 现在,这提供了很多机会,例如支持同一库的不同版本。 此功能仅扩展到插件,而不是片段。 片段没有自己的类加载器,而是使用父插件类加载器。
我们本可以使用插件类加载器支持,但是hadoop库是按片段而不是插件加载的。 我们将片段转换为插件,这需要完成现有代码库的重构任务。 在基于hadoop 1.x的插件形成之后。 我们可以为hadoop 2.x制作更多插件。 每个插件都加载自己的一组类。 现在唯一的要求是拥有更多的PermGem空间,因为无法将完整的插件加载到默认的PermGem空间中。
翻译自: https://www.javacodegeeks.com/2014/07/developing-eclipse-plugins.html