2017-04-19 13 views
0

OSKIバンドル(kuraを使用)を実装してAES暗号化を行っています。 私はここで、第三のライブラリjavax.cryptoで直接私の束の中に追加することは明らかである:javax.cryptoを使用した場合のClassCastException

Manifest-Version: 1.0 
Bundle-ManifestVersion: 2 
Bundle-Name: AES 
Bundle-SymbolicName: org.eclipse.kura.AES 
Bundle-Version: 1.0.0.qualifier 
Bundle-RequiredExecutionEnvironment: JavaSE-1.7 
Import-Package: org.osgi.service.component;version="1.2.0", 
org.slf4j;version="1.7.21" 
Service-Component: component.xml 
Export-Package: org.eclipse.kura.AES.services 
Bundle-ClassPath: ., 
lib/javax-crypto.jar 

私は復号化をしようとすると、私はこのエラーを取得しています:

java.lang.ClassCastException: com.sun.crypto.provider.AESCipher$General cannot be cast to javax.crypto.CipherSpi 
     at javax.crypto.Cipher.getInstance(Cipher.java:166) 
     at org.eclipse.kura.AES.services.AesServices.decrypt(AesServices.java:33) 
     at org.eclipse.kura.AES.AES_Activator.activate(AES_Activator.java:19) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:497) 
     at org.eclipse.equinox.internal.ds.model.ServiceComponent.activate(ServiceComponent.java:235) 
     at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.activate(ServiceComponentProp.java:146) 
     at org.eclipse.equinox.internal.ds.model.ServiceComponentProp.build(ServiceComponentProp.java:347) 
     at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponent(InstanceProcess.java:620) 
     at org.eclipse.equinox.internal.ds.InstanceProcess.buildComponents(InstanceProcess.java:197) 
     at org.eclipse.equinox.internal.ds.Resolver.buildNewlySatisfied(Resolver.java:473) 
     at org.eclipse.equinox.internal.ds.Resolver.enableComponents(Resolver.java:217) 
     at org.eclipse.equinox.internal.ds.SCRManager.performWork(SCRManager.java:816) 
     at org.eclipse.equinox.internal.ds.SCRManager$QueuedJob.dispatch(SCRManager.java:783) 
     at org.eclipse.equinox.internal.ds.WorkThread.run(WorkThread.java:89) 
     at org.eclipse.equinox.internal.util.impl.tpt.threadpool.Executor.run(Executor.java:70) 

私は私の上にOpenJDKを使用していますラズベリーパイ。私はoracle javaで試しましたが、それでも同じ問題がありました。私はopenjdkを完全に削除しなかったか、私が特定できない別の原因があります。 アイデア

答えて

1

同じクラスが異なるバンドルを使用して解決された場合、エラーが発生します。

私はあなたのバンドルにjavax.cryptoパッケージを埋め込んでいると思う。したがってバンドルには内部クラスCipherSpiがあり、バンドルにはjdkまたは別のバンドルのバージョンが表示されます。

解決策は、このようなapiパッケージを1つのソースから解決することです。あなたのケースでは、おそらく、javax.cryptoパッケージをインポートし、javax-crypto.jarを埋め込むだけで十分です。代わりに、jdkからパッケージをエクスポートするか、パッケージを含むバンドルをインストールする必要があります。

一般的なルールは、あなたが外界に公開しているAPIを通じて表示可能なパッケージを埋め込まないことです。

1

他の回答に記載されているように、内部パッケージがAPIを通じて公開されないように注意する必要があります。この場合、提供されたマニフェストとスタックのトレースは、重大かつ重大な問題を指します。

提供されたマニフェストは、次のImport-Packageステートメントを定義します。

Import-Package: org.osgi.service.component;version="1.2.0", 
    org.slf4j;version="1.7.21" 

は、これはいくつかの理由ですぐに疑わしいです:

  1. スタックトレースは、あなたが持つjavax.cryptoを通じてAESを使用したいのですが、パッケージをインポートしていないことを証明しています。代わりに、バンドル内でAPIを再パッケージ化しましたが、実装は再パッケージ化していません。 JDK実装を使用する場合は、クラス空間を共有する必要があります。

  2. 宣言型サービスAPI(org.osgi.service.component)をインポートします。DSコンポーネントは通常POJOであるため、宣言型サービスAPI(org.osgi.service.component)をインポートするのは珍しいことです。

  3. インポートはすべてバージョン範囲ではなく、単一のバージョンを使用します。 OSGi用語では、これは、インポートがバージョンXから無限大までであることを意味します。これは反パターンです。

は、私はあなたのマニフェストが手に作成され、これらの問題から推測します。マニフェストを生成するツール((such as bnd))を使用することを強くお勧めします。これらのミスの多くを防ぐことができます。

関連する問題