Java 如何从eclipse/osgi应用程序中包含对jar文件的依赖关系?

Java 如何从eclipse/osgi应用程序中包含对jar文件的依赖关系?,java,eclipse,plugins,eclipse-plugin,osgi,Java,Eclipse,Plugins,Eclipse Plugin,Osgi,我创建了一个Eclipse4应用程序,我需要一个jar作为我的应用程序的一部分提供功能(可以是任何东西,例如log4j,使它变得简单)。 我添加了jar作为项目类路径的一部分(右键单击->配置构建路径),但在运行时,我的服务失败,出现了ClassNotFound错误(我想是OSGI的错误)。 不管怎么说,搜索结果表明,至少据我所知,我应该将jar作为另一个插件的一部分添加到另一个中,并创建一个从我的应用程序/服务到这个新插件的依赖项。 也就是说,我从现有JAR档案创建了一个插件项目 这次安装成功

我创建了一个Eclipse4应用程序,我需要一个
jar
作为我的应用程序的一部分提供功能(可以是任何东西,例如
log4j
,使它变得简单)。
我添加了
jar
作为项目类路径的一部分(
右键单击->配置构建路径
),但在运行时,我的服务失败,出现了
ClassNotFound
错误(我想是OSGI的错误)。
不管怎么说,搜索结果表明,至少据我所知,我应该将jar作为另一个
插件的一部分添加到另一个
中,并创建一个从我的应用程序/服务到这个新插件的依赖项。
也就是说,我从现有JAR档案创建了一个
插件项目

这次安装成功了。
因此,如果我理解这一点,在为Eclipse/OSGi开发时,我们不应该直接在类路径中添加
jar
,而是通过插件添加它们(为什么?) 问题:如果到目前为止我的回答是正确的,那么在开发项目时包含
jar
的标准做法是什么?
从现有JAR归档文件中定义/创建一个
插件项目,并在其中添加所需的所有第三方库,或者根据所需的
JAR
或其他内容使用不同的插件项目???
如果我的术语不准确,很抱歉。我是OSGi和Eclipse编程的新手


注意:当谈论
jar时,我不是指其他OSGi服务。我指的是使用现成的、可靠的第三方库的规范,应用程序的许多部分都需要这些库。例如,
log4j
或xml解析库或
ApacheCommons

您提到的示例可以作为OSGi捆绑包使用,因此您不需要自己制作捆绑包。在OSGi中通常不使用直接jar依赖项,而是使用包或捆绑依赖项。在您提到的log4j示例中,您应该使用导入包,因为可以有多个捆绑提供程序(较新的log4j jar、较旧的log4j的springsource捆绑版本、slf4j实现…)。这将断开代码依赖项与实际提供程序的连接

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

Bundle-ClassPath: .,

 /lib/<legacy jar>.jar

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

对于运行时,清单和头部始终控制捆绑包类路径中的内容。有三种方法可以访问jar:

Bundle-ClassPath: .,

 /lib/<legacy jar>.jar
  • 导入包头。这是推荐的方法。每个需要的包定义一个导入。您想要访问的jar必须作为捆绑包部署在运行时中。它还需要导出所有需要的包

  • 需要捆绑。这是访问捆绑包的另一种方式。您可以定义所需包的id,并查看它导出的所有包。由于Require Bundle将您与另一个Bundle绑定得更紧密,因此应首选导入包方式

  • 捆绑类路径。这允许将JAR添加到类路径中,并嵌入到自己的包中。只有当另一种方法不起作用时,这才应该是最后的手段。将此方法与其他方法混合使用时,可能会出现严重的类加载问题

  • 您可以在maven central中找到许多预构建的捆绑包。如今,许多JAR已经包含OSGi清单。对于情况并非如此的情况,servicemix将许多JAR重新打包为捆绑包。请参阅groupId:org.apache.servicemix.bundles。还有SpringBundle存储库,您可以在其中找到更多信息

    下面我列出了一些您可能想阅读的资源:


    事实上,我们在项目中遇到了同样的问题。 我们有一些与OSGi不兼容的遗留jar,我们创建了与BundleContent并行的lib文件夹,并将其添加到清单的classpath部分

    Bundle-ClassPath: .,
    
     /lib/<legacy jar>.jar
    
    Bundle类路径:。,
    /lib/.jar
    

    如果只有一个包要使用它,则无需不必要地导出和导入包,

    您的最终目标是什么:是否要为“您的”项目创建可交付成果,比如说一个jar/zip,它拥有运行你的程序所需的所有类/jar/资源?@thekashyap:我不确定我是否理解你的问题。导出的产品是由
    .product
    配置预定义的,对吗?所以我关心的是如何设置项目,以便在部署中我知道所有必需的JAR都可用。检查:和我的坏。。在你的问题中没有读过“OSGi”…-)。。查看我发布的链接,它描述了“捆绑包”的概念。。考虑到OSGi架构,我的猜测是您应该将所有基本服务作为现有捆绑包提供。但是如果我使用
    import包
    ,这意味着
    jar
    在部署时位于
    OSGi
    容器的某个地方,对吗?那么我如何知道哪些jar已经可用?例如,我如何知道
    log4j
    已经提供了吗?我将如何使用ApacheCommons?这也包括在内吗?这是怎么可能的?我的意思是,在某些情况下,我需要一些尚未作为捆绑包提供的jar,对吗?应用程序捆绑包的部署是特定于实现的。在eclipse中,您的目标平台决定哪些捆绑包可用。对于未绑定的jar,您可以通过eclipse从现有jar创建一个新的插件项目来为它们创建绑定。您也可以将其包含在捆绑包中,但我更喜欢捆绑包方法。是的,这又回到了我最初的问题。如果我像您所指出的那样从现有jar创建一个新的插件项目,我应该在该项目中包含所有需要的jar,还是为每个需要的jar创建一个不同的捆绑包项目?我总是使用捆绑包