(使用eclipse)
我正在使用第三方提供的JAR课程。第三方JAR有这条线:
var = Cipher.getInstance("AES");
当执行此行时,它会抛出以下堆栈跟踪:
13:38:00,120 ERROR [stderr] (EJB default - 1) java.lang.ExceptionInInitializerError
13:38:00,121 ERROR [stderr] (EJB default - 1) at javax.crypto.Cipher.getInstance([DashoPro-V1.2-120198])
...
BLAH BLAH BLAH
(Stack trace which leads all the way down to the call I make through the third party jar)
...
13:38:00,154 ERROR [stderr] (EJB default - 1) Caused by: java.lang.SecurityException: Cannot set up certs for trusted CAs
13:38:00,154 ERROR [stderr] (EJB default - 1) at javax.crypto.b.<clinit>([DashoPro-V1.2-120198])
13:38:00,155 ERROR [stderr] (EJB default - 1) ... 55 more
以前,我通过将其粘贴到我的eclipse项目中的文件夹中,然后将JAR添加到我的构建路径和部署程序集中来访问此JAR。
但是,因为我们希望两个不同的部署使用从第三方jar初始化的对象的相同实例,所以决定将第三方JAR移动到JBoss AS 7“模块”
我们在构建路径中的项目中维护了对JAR的引用,但是将其从部署程序集中删除了。我还添加了“依赖关系:com ... [模块中指定的路径]”
这似乎有效,因为项目将构建和部署。
但是,每当我尝试调用已被调用数十万次的方法时,我就会遇到此异常。
异常似乎是在SunJCE_b.class的静态初始化期间抛出的,但我完全不确定。
这是第一次抛出SecurityException时的堆栈:
b.e() line: not available
b.clinit() line: not available
Cipher.getInstance(String) line: not available
OtherCompanyCryptography.getCipherInstance() line: not available
我在网上找不到任何对javax.crypto.b.e()的引用。
以前这是如何工作的,但当我把它变成JBoss模块时,它停止了工作?
另外,我该如何解决这个问题?
答案 0 :(得分:2)
首先,您提供了有关两种不同JVM的信息:
SunJCE_b
类来自Oracle(Sun)JVM javax.crypto.b
类来自IBM JVM 特别是他们正在做同样的事情。他们负责验证加密组件签名。 在大多数情况下,这种堆栈跟踪是由类路径上的错误管辖区策略文件引起的。然后在IBM JVM上,您可以在堆栈跟踪中看到:
Caused by: java.lang.SecurityException: Jurisdiction policy files are not signed by trusted signers!
at javax.crypto.b.a
另一个原因可能是加密提供程序具有无效(或旧)签名。如果您提供更详细的堆栈跟踪,那么我将能够提供更多帮助。
答案 1 :(得分:0)
亲爱的未来的人们:
我们最终使用的解决方法是将第三方jar打包到一个单独的项目中,我们称之为ApiCommons。
然后我们创建了一个名为ApplicationBundle.ear
的组合应用程序ApplicationBundle.ear包含我们想要使用相同对象的两个部署模块,通过JNDI在两者之间共享。
ApplicationBundle项目在其“部署程序集”
中包含ApiCommons中的jar我们能够将两个部署模块保持为单独的eclipse项目,但是它们部署在单个.EAR文件中,并且两个捆绑项目在其构建路径上都有ApiCommons,但不是它们的部署程序集。