0

我有一个大型 Java 应用程序,它主要是网络和文件处理,具有大量数据库访问权限。没有用户界面。我们暴露了一些 Web 服务(嵌入式 Netty)并调用了一些外部的 REST Web 服务。该项目是用 Ant 构建的。它大约有 10 个不同的罐子加上 30-40 个库。

我当前的任务是将项目移至 OSGi 框架。我慢慢地吓了一跳。

按照“OSGi In Action”第 6 章中的示例,我使用 BND ant 任务将整个项目放入一个巨大的 jar 文件中。这行得通。我可以使用 java -jar 运行程序。这是我当前的 .bnd 文件:

-output: bundle/MerchantServicesBundle.jar
-include: manifest/merchantservices.manifest
Bundle-Name: MerchantServices
Bundle-SymbolicName: com.shopping.services.merchant
Bundle-Version: 4.1
Main-Class: com.shopping.merchant.services.netty.MerchantServices
Class-Path: /home/ppantera/repositories/MerchantJava/modules/MerchantServices/conf/

Private-Package: *

我正在使用 Apache Felix 4.0.3。从 Gogo shell 我可以安装包,但是当我启动它时,我得到了这个:

org.osgi.framework.BundleException:捆绑com.shopping.services.merchant [8]中未解决的约束:无法解决8.0:缺少要求[8.0] osgi.wiring.package;(osgi.wiring.package=android.dalvik)

为什么 Felix 认为这是一个 Android 项目?

网上好像没有太多关于这个的。你会推荐使用旧版本的 Felix,这样我就不会受到可能导致我困惑的新 OSGi 功能的影响吗?

我尝试将其添加到我的 .bnd 文件中:

需求能力:osgi.ee;过滤器:=“(&(osgi.ee=JavaSE)(版本>=1.7))”

那没有帮助。我究竟做错了什么?还有其他指针吗?

4

2 回答 2

2

看起来 bnd 以某种方式检测到对 Android 包的要求,并将其添加到 MANIFEST.MF,它可能在您的代码中,但也可能在您的第 3 方库之一中。

检查你的清单以确保,我想你会发现类似的东西

Import-Package:android.dalvik. 

如果是这种情况,您可以通过手动删除该标头来测试捆绑包,看看是否有帮助。当你明白这一点后,你可以解决它,例如通过在 bnd 中将该导入设为可选。

于 2013-02-14T23:42:54.293 回答
0

一种简单的解决方案是:

转到 FuseESB 控制台:

键入命令:

osgi:安装 mvn:commons-io/commons-io/2.1

将 'common's-io' 替换为您的依赖项的组 ID 和工件 ID(Maven),例如我的依赖项是:

<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.1</version>
    <scope>provided</scope>
</dependency>

干杯

于 2013-04-24T11:42:18.787 回答