2012-09-24 56 views
8

我创建了一个Eclipse 4应用程序,我需要一个jar作为我的应用程序的一部分提供功能(这可以是任何东西,例如log4j以使其变得微不足道)。
我添加了jar作为我项目类路径(Right Click->Configure Build Path)的一部分,但在运行时我的服务失败,出现ClassNotFound错误(来自OSGI,我猜?)。
无论如何搜索这个结果,至少据我了解,我应该添加jar作为另一个Plugin的一部分,并创建从我的应用程序/服务到这个新插件的依赖项。
I.e.我创建了一个Plugin Project from Existing JAR archives
这一次设置工作。
所以,如果我明白这一点,当为Eclipse/OSGi开发时,我们不应该直接在类路径中添加jars,而是通过插件添加它们(为什么?)。
问题:如果我到目前为止是正确的,那么在开发项目时包含jars的标准做法是什么?
定义/创建一个Plugin Project from existing JAR archives并添加所有所需的第三方那里需要的库,有每一个不同的插件项目所需jar别的东西或许???
对不起,如果我的术语不准确。我是OSGi和Eclipse编程中的新手如何从eclipse/osgi应用程序中将依赖项包含到jar文件中?

说明:在谈到jars时,我并不指向其他OSGi服务。我指的是使用准备好,可靠的第三方库的规范,这是许多应用程序所需要的。例如。 log4j或xml解析库或apache commons

+0

什么是你的终极目标是:你想创建“您的”项目交付,说一个jar/zip包含所有需要的类/ jar /资源来运行你的程序? – Kashyap

+0

@thekashyap:不知道我理解你的问题。导出的产品是由'.product'配置预定义的,对吗?所以我担心如何设置项目,以便在部署中我知道所有必需的罐子都可用。 – Cratylus

+0

查看:http://www.vogella.com/articles/OSGi/article.html和http://www.coderanch.com/t/104274/vc/Order-Export-tab-Java-Build – Kashyap

回答

3

您提到的示例可用作OSGi包,因此您无需自己将它们捆绑在一起。您通常不使用OSGi中的直接jar依赖项,通常使用包或包依赖项。在您提到的log4j示例中,您应该使用导入包,因为可以有多个捆绑包提供程序(较新的log4j jar,springource捆绑版本的较旧的log4j,slf4j实现...)。这会将您的代码依赖关系从实际提供者中断开。

这些依赖关系通过您的清单维护,而不是您的项目类路径。在eclipse插件项目中,项目构建类路径是从清单中的条目派生的。

即使您没有使用服务,所有代码依赖关系仍然通过清单维护。

+0

但是,如果我使用'import package',这意味着'jar'在部署权的'OSGi'容器中的某处,那么我怎么知道哪些jar已经可用?我怎么知道'log4j'已经提供了?我将如何使用'apache commons'?这是否也包含在内?这怎么可能? – Cratylus

+0

另外我的意思是有些情况下,我需要一些没有作为捆绑包提供的jar,对吧? – Cratylus

+0

为应用程序部署捆绑软件是特定于实现的。在eclipse中,您的目标平台确定可用的捆绑包。至于非捆绑的罐子,你可以通过创建一个新的插件项目形式现有的jar来简单地为他们创建捆绑包。你也可以将它包含在捆绑中,但我更喜欢捆绑方式。 – Robin

5

对于运行时,它始终是Manifest和那里的头文件,用于控制bundle classpath中的内容。有三种方法可以访问jar:

  1. 导入包头。这是推荐的方式。您为每个需要的软件包定义一个导入。您想要访问的jar必须作为一个包在运行时部署。它还需要导出所有需要的软件包。

  2. Require-Bundle。这是访问包的另一种方式。您可以定义您需要的软件包的ID并查看它导出的所有软件包。由于Require-Bundle将你更紧密地绑定到另一个bundle,所以Import-Package方式应该是首选。

  3. Bundle-Classpath。这允许将jar添加到您嵌入到您自己的包中的类路径中。当另一种方式不起作用时,这应该是最后的手段。将其与其他方法混合使用时,您可能会遇到讨厌的类加载问题。

您可以在maven中心找到许多预建包。今天的许多罐子已经包含OSGi清单。对于这种情况并非如此,许多罐子被servicemix重新打包为捆绑包。请参阅groupId:org.apache.servicemix.bundles。还有春季束库,你可以找到更多。

下面我列出你可能想读一些资源:

http://www.aqute.biz/Blog/2007-02-19

http://wiki.osgi.org/wiki/Import-Package

http://wiki.osgi.org/wiki/Require-Bundle

http://www.vogella.com/blog/2009/03/27/required-bundle-import-package/

+0

For case( 1)如果我需要为需要的罐子创建一个捆绑包,我应该把所有需要的罐子放在这个捆绑包中(如果我需要多个罐子)**或**每个罐子应该放在每个捆绑包中? – Cratylus

+0

我认为从罐子制作捆绑包的最好方法就是添加Manifest条目。所以每个jar都将是它自己的包。这有一个优点,就是你的maven depdendency结构与bundle相匹配。顺便说一句。如果你必须创建bundle,请查看bnd和maven bundle插件。 –

3

我们面对我们的项目Extactaly同样的问题。 我们有一些与OSGi不兼容的遗留JAR,我们创建了与BundleContent平行的lib文件夹并将其添加到清单的classpath部分。

Bundle-ClassPath: ., 

/lib/<legacy jar>.jar 

没有必要对出口和不必要的,如果只有一个包会消耗它包进口,

+2

+1此捆绑包的内容增加了一个无法承受的开销,特别是在并行开发JAR和Eclipse插件时。令人讨厌的是,在每一次迭代中,它都会消耗时间,从而启动流程......我**非常憎恨Eclipse **,因为它避开了插件开发过程中的Maven。是的,有Tycho,但我宁愿用我刚断开的手臂拍我自己的头,我只是咬我自己的肩膀,直到我感觉舒服,而不是使用为Eclipse插件传统设计的那种神秘的,无证的乐队援助JAR依赖用法。敏捷,不! – ppeterka

相关问题