在捆绑包中包含第 3 方罐子
Posted
技术标签:
【中文标题】在捆绑包中包含第 3 方罐子【英文标题】:Include 3rd party jars in bundle 【发布时间】:2012-06-06 23:39:59 【问题描述】:我正在尝试在我的捆绑包中包含第 3 方 jar。我正在关注本教程 http://www.aqute.biz/Blog/2007-02-19 ,但是在我的 Activator 中,我在尝试从该外部 jar 引用一个类时得到 ClasNotFoundException。
我的bundle jar目录结构:
-\MyBundle
-\plugin.xml
-\META-INF
-\MANIFEST.MF
-\org
-\mybundle
-\Activator.class
-\3rdParty.jar
MANIFEST.MF 如下所示:
...
Bundle-ClassPath: .,
3rdParty.jar
...
它是 Eclipse 3.5.1 RCP 应用程序的一部分。
错误信息:
java.lang.ClassNotFoundException: 3rd.party.proxy.ConfiguratorProxy
at org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:494)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:410)
at org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:398)
at org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:105)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at my.program.eclipse.core.ProcessEditorUploaderActivator.start(ProcessEditorUploaderActivator.java:111)
但是当我调用 this.getClass().getResource("/3rdParty.jar") 时它可以工作。
编辑:问题已解决。我不得不从我的 RCP 应用程序中删除 org.eclipse.core.runtime、org.eclipse.equinox.app 和 org.eclipse.osgi 目录。缓存了有关捆绑包类路径的信息。
【问题讨论】:
3rdparty.jar
是您在 Bundle-ClassPath 中提到的 jar 之一吗?另外,您能否发布确切的信息(即,似乎缺少什么类,您希望它来自哪里?)
是的,3rdparty.jar 是 Bundle-ClassPath 中提到的 jar 之一。我做对了。
【参考方案1】:
您是从 Eclipse 运行它吗?如果是这样,您的第三方包也应该列在您的 .classpath 文件中。你应该有这样的一行:
<classpathentry exported="true" kind="lib" path="lib/thirdparty.jar"/>
(这应该在使用 MANIFEST 编辑器时自动发生)
如果您要导出插件并以其他方式运行它,您将需要一个 build.properties 文件,该文件应类似于:
source.. = src/
output.. = classes/
bin.includes = META-INF/,\
.,\
lib/thirdparty.jar
【讨论】:
我正在将包导出到 jar 并加载到我的 RCP 应用程序。我的项目中有 build.properties 文件。【参考方案2】:需要检查的一些事项:
你的 3rdParty.jar 真的在 bundle jar 里面吗?用 Winzip 打开并检查。
您的 Manifest.MF 是否正确?尝试将 Bundle-ClassPath: 的所有条目放在一行上,不要换行: Bundle-ClassPath: .,3rdParty.jar
您试图从哪里访问这些类?内部 jar 的类将从 MyBundle.jar 的类中可见,但它们不会从框架中的其他包中可见,除非您在清单中导出包!
【讨论】:
忘了说,我正在尝试通过 this.getClass().forName("3rd.party.proxy.ConfiguratorProxy") 访问外部类。 1.是的,它在里面。 2. 清单似乎正确。我已经尝试了数百万种配置。 3. 我正在尝试从我的 Activator 类中的 start() 方法访问外部类。我发现即使没有直接在我的 Bundle-ClassPath 中指定它,我也可以访问另一个 3rdParty2.jar 的类。但是对于第一个罐子它不起作用。以上是关于在捆绑包中包含第 3 方罐子的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Maven 将第 3 方 OSGi 捆绑包添加到部署包中?
为啥 lib 模块不能在 android studio 中包含第三个 lib