在Eclipse插件中导出jar库

3
我正在开发一个Eclipse插件,其中包含几个组件。以前这是一个单一的插件,一切都很好。然而,最近我将其分成多个插件,这些插件是单一功能的一部分。
结构是特性中有许多插件。有一个“核心”插件,其中包含通用代码和库。每个其他插件都依赖于核心插件。
问题在于,虽然插件编译良好,并且没有关于plugin.xml、manifest等的警告,但插件在运行时无法工作,因为缺少类。具体来说,我在核心插件中使用了Google Guava,但是在运行时找不到Guava jar中的类。还有其他的jar文件,但这是第一个出现问题的。
我尝试过几种解决方法: - 在核心项目中导出包含在Guava jar中的包,结果相同: 无法工作。 - 将Guava jar放在每个插件中确实有效,但由于额外的大小而不受欢迎。 - 根据我的搜索,我可以在plugin.xml中添加一个标签,但Eclipse会忽略它,因为我有一个清单。我还没有找到一种方式将等效设置添加到清单中。
唯一实际起作用的方法是创建一个库插件,它基本上解压并合并所有jar文件。问题是这里有一个混杂的随机文件。如果我想要升级一个jar文件,重新生成项目很繁琐,而且当搜索项目的SVN历史记录时可能会很困难。
是否有其他方法可以实现这一点,并使更新的jar文件易于使用,只需进行最少的更改即可?

最好为每个库创建一个捆绑包;您可以使用相同版本的包含库来对捆绑包进行版本控制;这样就再也没有比这更清晰的了。或者,您可以开始使用Tycho来配置Maven构建,但仍然依赖于OSGi清单。顺便问一下:您是否在包含它的插件的清单中导出了Guava软件包(通过Export-Package:头)? - guido
是的,我在清单文件中将包导出到jar文件中,但Eclipse会告诉我该包不存在。我认为我喜欢每个jar有多个依赖项的想法。因此,我基本上会将每个库包装成自己的插件。不过,这样更新容易吗?我没有看到使用新的jar文件自动更新库项目的选项。 - user439793
2个回答

1
在核心项目中导出Guava jar中包含的软件包会产生相同的结果:无法工作。
你是否对此有疑问?
据我所知,在Eclipse Equinox中,OSGi容器可以使用其他捆绑包资源。
因此,请确保您从正确的位置导出正确的内容。
可能,其他捆绑包无法识别从核心捆绑包导出的类(请检查所有子捆绑包中的import-package)或者类加载器中发生了一些错误。
尝试在清单中使用“Eclipse-Buddy policy”属性。它可能有效 :-)

我不得不导出Guava和其他JAR文件中的每个单独的包,然后导入每个插件中使用的每个单独的包。非常繁琐,但是它起作用了。 - user439793
1
我是Eclipse插件新手,所以这可能是常识,但对我来说关键是更新导出所需包的项目的类路径。如http://robertvarttinen.blogspot.com.au/2007/01/adding-third-party-jar-to-your-eclipse.html中所述,“右键单击并选择“PDE工具”->“更新类路径””。 - Tom Saleeba
@Snowman:您能否简单解释一下最终是什么解决了问题?您使用了“Eclipse-BuddyPolicy”吗?您是如何做到的? - Lii
@Lii,很抱歉我不能这样做。我最终移除了那些依赖项,只依赖于核心Java和Eclipse。此外,我已经转向更美好的领域,无法检查源代码控制历史记录。 - user439793

0

我所做的一些工作是:

  1. 创建一个Maven项目并将所有依赖项放在那里
  2. 编写您的代码,包括算法和插件/应用程序的所有逻辑
  3. 构建项目。您将拥有一个大的jar文件。类似于“myproject-with-dependencies.jar”
  4. 在Eclipse中:
    1. 右键单击 -> 从现有JAR档案创建插件。 enter image description here
    2. 从步骤3中选择您的jar文件。
    3. 检查您的plugin.xml并仅导出所需的软件包(以避免在Osgi中出现ClassCastExpeption)
  5. 最后,从您拥有的其他插件中添加对此插件的依赖项

注意事项:

  • 这是我用来避免p2站点和jars转换为bundles的方法(特别是因为我使用Tycho来构建我的Eclipse插件)。
  • 这不是最好的解决方案,但会节省您很多时间。相信我!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接