1

OSGi バンドルで com.sun.crypto.provider.SunJCE (HMAC 用) を使用しようとしています。

これらの構成でmaven-bundle-pluginを使用しています:

<Embed-Dependency>*;scope=runtime;inline=false</Embed-Dependency>
<Import-Package>*;resolution:=optional</Import-Package>

バンドルを実行すると、次のエラーが発生します。

Caused by: java.lang.ClassNotFoundException: com.sun.crypto.provider.SunJCE

OSGi バンドルのコードが com.sun.crypto.provider にアクセスできるようにするにはどうすればよいですか?

4

2 に答える 2

3

Maven の設定を見ると、すべてのパッケージのインポートをオプションにするのは賢明ではないことがわかります。バンドルの開始時に何かが正しくないことを知らせるのではなく、実行時に問題を延期することにより、OSGi が提供する利点の多くを台無しにします。つまり、速く失敗するのではなく、ゆっくりと失敗します。本当にオプションの依存関係にのみ適しています。

もちろん、あなたの最終的な目標は、ただ速く失敗することではなく、まったく失敗しないことです。何が起こっているのかを理解するための出発点として、ビルドされたバンドルを開いて、暗号化パッケージが実際に埋め込まれていることを確認しましたか? ビルドが期待どおりに機能しているかどうかを確認することをお勧めします。

ただし、この特定のケースでは、これは通常 JVM が提供することを期待するクラスであるため、ブート クラスパスをチェックして利用可能であることを確認し、embed 依存関係を削除し、org.osgi.framework.system を使用することをお勧めします。依存関係を埋め込む代わりに .packages.extra プロパティ。

于 2012-04-04T04:28:08.963 に答える
0

なぜ com.sun.crypto クラスが必要なのですか? 一般に、java.* API を介して暗号化機能にアクセスできますか? 例えば:

 KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
 SecretKey key = keyGen.generateKey();
 Mac mac = Mac.getInstance(key.getAlgorithm());
 mac.init(key);
 String str = "This message will be digested";
 byte[] utf8 = str.getBytes("UTF8");
 byte[] digest = mac.doFinal(utf8);
于 2013-04-05T13:07:58.227 に答える