gpt4 book ai didi

java - 使用 javax.crypto 时出现 ClassCastException

转载 作者:行者123 更新时间:2023-12-02 02:53:14 26 4
gpt4 key购买 nike

我正在实现一个 OSGI 包(使用 kura )来进行一些 AES 加密。我直接在我的包中添加了第三个库 javax.crypto,这是 list :

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,要么是有其他我无法识别的原因。有什么想法吗?

最佳答案

如果使用不同的包解析同一个类,您得到的错误是典型的。

我怀疑您将包 javax.crypto 嵌入到您的包中。因此,您的 bundle 会看到内部类 CipherSpi,而外部 bundle 会看到来自 jdk 或其他 bundle 的版本。

解决方案是确保仅从一个来源解析此类 api 包。在您的情况下,导入包 javax.crypto 并且不嵌入 javax-crypto.jar 可能就足够了。相反,您必须从 jdk 导出该包或安装包含它的 bundle 。

一般规则是永远不要嵌入可能通过您向外界公开的 api 可见的包。

关于java - 使用 javax.crypto 时出现 ClassCastException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43491542/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com