繁体   English   中英

java NoClassDefFoundError 但类在那里并且可用

[英]java NoClassDefFoundError but Class is there and Usable

我有一个很奇怪的(对我来说)问题。 我使用充气城堡来解密/加密 Web 应用程序中的一些邮件。 重新部署我的应用程序后,我收到此异常

java.lang.NoClassDefFoundError: org/bouncycastle/jcajce/spec/SkeinParameterSpec at org.bouncycastle.jcajce.provider.symmetric.util.BaseMac.engineInit(Unknown Source) at javax.crypto.Mac.init(Mac.java:443)在 org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.calculatePbeMac(Unknown Source) 在 org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(Unknown Source) 在 java.security.KeyStore. .java:1445) 在my.application.Class .getDecryptedContent( my.application.Class .java:401) 在my.application.Class .decrypt( my.application.Class .java:91) 在my.application.Class 。 getKvConnectMail( my.application.Class .java:320) 在my.application.Class .processEinClick ( my.application.Class .java:198) 在my.application.Class .shedule( my.application.Class .java:44)在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在 sun.reflect.DelegatingMethodAccessorImpl。 invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273) at org.springframework.scheduling.support .MethodInvokingRunnable.run(MethodInvokingRunnable.java:65) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:51) at org.springframework.scheduling.concurrent.ReschedulingRunnable.8) at org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:51) java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor) .java:180) 在 java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor Worker.run(Thr eadPoolExecutor.java:617) 在 java.lang.Thread.run(Thread.java:745)

所以我认为我的应用程序的 WEB-INF/lib 文件夹中缺少 lib,但它在那里。

奇怪的是:如果我直接使用带有此 Codesnipped 的 Class ,则 Snipped 会正确执行而不会出错。

LOGGER.error("Class!!!: " + SkeinParameterSpec.class.getName());
SkeinParameterSpec spec = new SkeinParameterSpec();
LOGGER.error("Instance!!!: " + spec.toString());
LOGGER.error("Instanceof: " + (spec instanceof SkeinParameterSpec));

但是库类 org.bouncycastle.jcajce.provider.symmetric.util.BaseMac 使用与我截取的代码几乎相同的代码以上面的异常结束。

有人可以帮助我理解为什么会发生这种情况吗?

PS:这只会在重新部署后重新启动整个 Tomcat 时发生,每个人都认为有效。

更新 1:我忘了说我使用 Liferay。 但是我的 WebApplication 是一个正常的,与 Liferay 没有任何关系。

但是:经过一番调查,我发现 Liferay 有一些库(/tomcat/webapps/ROOT/lib)。 还有旧版本的 Bouncycastle。 这个库是否有可能被我的 WebApplication 使用并且错误是 Liferay 的库和 CustomClassLoaders 的结果?

解决方案:请参阅正确答案中的“inigo 撇渣器”评论。

原因可能是 BouncyCastle 向当前的 ClassLoader 注册,并且在您重新启动 Web 应用程序时卸载了它。 您应该在 JRE 本身中注册 BouncyCastle。 参见BouncyCastle 类的 NoClassDefFoundError

我猜类路径上可能有另一个版本的 bouncycastle lib(可能在 Tomcat/lib 文件夹中),或者其他一些 jar 需要,它首先加载并且不包含所需的类。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM