访问Equinox中的com.sun.crypto.provider

时间:2012-02-23 16:42:07

标签: encryption osgi equinox classloader

我正在尝试集成一些依赖于它的预先存在的代码 com.sun.crypto.provider.SunJCE类进入我们的Equinox 应用程序(版本3.7.1)。现在我默认知道com.sun bundle无法访问包,所以我用它创建了一个片段 扩展框架以导出包的想法。这是它的 清单:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Extension
Bundle-SymbolicName: extension
Bundle-Version: 1.0.0.qualifier
Fragment-Host: system.bundle; extension:=framework
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Export-Package: com.sun.crypto.provider

线索1:PDE标记了Export-Package行并说明了这一点 此插件中不存在com.sun.crypto.provider。

我创建了一个示例包,它只是实例化了有问题的类 在捆绑激活器中。该捆绑包的清单是:

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Cryptotest
Bundle-SymbolicName: cryptotest
Bundle-Version: 1.0.0.qualifier
Bundle-Activator: cryptotest.Activator
Bundle-ActivationPolicy: lazy
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: com.sun.crypto.provider,
 org.osgi.framework;version="1.3.0"

线索2:PDE用访问限制标记实例化。

尽管有两个错误,但项目确实已编译,我能够 开始调试。启动示例包时,我会收到一个类 没找到例外。但是,当我在控制台中执行“package 0”时,它会出现 Equinox声称要出口这个包裹:

com.sun.crypto.provider;
version="0.0.0"<org.eclipse.osgi_3.7.1.R37x_v20110808-1106 [0]>
 cryptotest_1.0.0.qualifier [2] imports

现在,我发现一个丑陋的工作似乎在我的最小例子中起作用。它基本上将Java的jce提供者jar包装在一个单独的插件中,并将其包含在我的应用程序中,但这似乎是错误的。

有人可以提供一些有关正在发生的事情的见解吗?是 有什么明显我想念的吗?

1 个答案:

答案 0 :(得分:3)

这看起来像是JVM中存在的包,但仅限在Sun上运行时。默认情况下,系统捆绑包不会公开这些内容,因为OSGi不是专门为Sun VM构建的。

但是,您可以指示框架公开此程序包。为此,您需要将org.osgi.framework.system.packages.extra属性设置为包列表,其中包含您的com.sun.crypto.provider包。有几种方法可以做到这一点,但您可以使用系统属性启动Equinox,

-Dorg.osgi.framework.system.packages.extra=com.sun.crypto.provider

顺便说一句,这不是特定于Equinox的,而是标准的OSGi构造。