Encryption 在Equinox访问com.sun.crypto.provider

Encryption 在Equinox访问com.sun.crypto.provider,encryption,osgi,equinox,classloader,Encryption,Osgi,Equinox,Classloader,我正在尝试集成一些依赖于 将com.sun.crypto.provider.SunJCE类导入基于Equinox的 应用程序(版本3.7.1)。现在我默认知道com.sun 包不能被包访问,所以我用 扩展框架以导出包的想法。这是它的 舱单: Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: Extension Bundle-SymbolicName: extension Bundle-Version: 1.0.0.quali

我正在尝试集成一些依赖于 将com.sun.crypto.provider.SunJCE类导入基于Equinox的 应用程序(版本3.7.1)。现在我默认知道com.sun 包不能被包访问,所以我用 扩展框架以导出包的想法。这是它的 舱单:

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标记了出口包装行,并表示 此插件中不存在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使用访问限制标记实例化

尽管有这两个错误,项目还是编译了,我能够 开始调试。启动示例包时,我收到一个类 未找到异常。但是,当我在控制台中执行“packages 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
com.sun.crypto.provider;
version=“0.0.0”
cryptotest_1.0.0.qualifier[2]导入
现在,我发现了一个丑陋的解决方案,在我的最小示例中似乎有效。基本上是将Java的jce提供者jar封装在一个单独的插件中,并将其包含在我的应用程序中,但这似乎是错误的

有人能提供一些关于发生了什么的见解吗?是
很明显,我遗漏了什么?

这看起来像是JVM中存在的一个包,但只有在Sun one上运行时才会出现。默认情况下,系统包不会公开这些内容,因为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结构。

谢谢您的建议。我尝试了这个选项,但仍然得到相同的错误。我认为这可能是因为在运行Equinox时,jce jar不在引导路径中,所以vm不知道它是可用的。1) 使用主机为bundle 0的片段,然后导出包。在修改引导路径以包含jce jar之后,这就起到了作用。2) 除了将jce jar添加到引导路径之外,还可以使用建议的cmd行arg。我想有一个小小的缺点是这种方法将jce暴露给所有插件,不管它们是否导入包。不会影响我,但对某些人来说可能是个问题?无论如何,接受答案和+1是一个更简单的解决方案;最好将jar很好地包装成一个包,导出包,而不是扩展系统包。我的解决方案本质上是将您带回常规类路径。