java NoClassDefFoundError,但类存在且可用

java NoClassDefFoundError,但类存在且可用,java,liferay,classloader,liferay-6,noclassdeffounderror,Java,Liferay,Classloader,Liferay 6,Noclassdeffounderror,我有一个非常奇怪的问题。我使用bouncy castle在Web应用程序中对一些邮件进行解密/加密。在重新部署应用程序后,我会遇到此异常 java.lang.NoClassDefFoundError:org/bouncycastle/jcajce/spec/SkeinParameterSpec 位于org.bouncycastle.jcajce.provider.symmetric.util.BaseMac.engineInitUnknown Source 在javax.crypto.Mac.i

我有一个非常奇怪的问题。我使用bouncy castle在Web应用程序中对一些邮件进行解密/加密。在重新部署应用程序后,我会遇到此异常

java.lang.NoClassDefFoundError:org/bouncycastle/jcajce/spec/SkeinParameterSpec 位于org.bouncycastle.jcajce.provider.symmetric.util.BaseMac.engineInitUnknown Source 在javax.crypto.Mac.initMac.java:443 位于org.bouncycastle.jcajce.provider.keystore.pkcs12.pkcs12keystrespi.calculatepbemac未知源 位于org.bouncycastle.jcajce.provider.keystore.pkcs12.pkcs12keystrespi.engineLoadUnknown来源 位于java.security.KeyStore.loadKeyStore.java:1445 在my.application.Class.getDecryptedContentmy.application.Class.java:401 在my.application.Class.decryptmy.application.Class.java:91 在my.application.Class.getKvConnectMailmy.application.Class.java:320 在my.application.Class.processEinClickmy.application.Class.java:198 在my.application.Class.scheduleMy.application.Class.java:44 在sun.reflect.NativeMethodAccessorImpl.invoke0Native方法中 位于sun.reflect.NativeMethodAccessorImpl.invokeNativeMethodAccessorImpl.java:62 在sun.reflect.DelegatingMethodAccessorImpl.invokeDelegatingMethodAccessorImpl.java:43 位于java.lang.reflect.Method.invokeMethod.java:497 位于org.springframework.util.MethodInvoker.invokeMethodInvoker.java:273 位于org.springframework.scheduling.support.MethodInvokingRunnable.runMethodInvokingRunnable.java:65 位于org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.runDelegatingErrorHandlingRunnable.java:51 位于org.springframework.scheduling.concurrent.ReschedulingRunnable.runReschedulingRunnable.java:81 位于java.util.concurrent.Executors$RunnableAdapter.callExecutors.java:511 位于java.util.concurrent.FutureTask.runFutureTask.java:266 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201ScheduledThreadPoolExecutor.java:180 位于java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runScheduledThreadPoolExecutor.java:293 位于java.util.concurrent.ThreadPoolExecutor.runWorkerThreadPoolExecutor.java:1142 位于java.util.concurrent.ThreadPoolExecutor$Worker.runThreadPoolExecutor.java:617 java:745

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

奇怪的是:如果我将类直接用于此代码剪切,则剪切的代码将正确执行,没有错误

LOGGER.error("Class!!!: " + SkeinParameterSpec.class.getName());
SkeinParameterSpec spec = new SkeinParameterSpec();
LOGGER.error("Instance!!!: " + spec.toString());
LOGGER.error("Instanceof: " + (spec instanceof SkeinParameterSpec));
但是库类org.bounchycastle.jcajce.provider.symmetric.util.BaseMac使用了与我的snipped几乎相同的代码,但上面的例外情况除外

有人能帮我理解为什么会这样吗

附言: 如果重新启动整个Tomcat,只有在重新部署之后才会发生这种情况

更新1: 我忘了说我用的是Liferay。但我的Web应用程序是一个普通的应用程序,与Liferay没有任何关系

但是:经过一些调查,我发现Liferay有一些库/tomcat/webapps/ROOT/lib。还有旧版本的Bouncycastle。这个库是否可能被我的Web应用程序使用,并且错误是Liferay的库和CustomClassLoader导致的

解决方案:
请参阅正确答案处的“inigo skimmer”注释。

我猜类路径上可能有另一个版本的bouncycastle lib,可能在Tomcat/lib文件夹中,或者是先加载的某个jar所需的,但不包含所需的类。

我猜类路径上可能有另一个版本的bouncycastle lib,可能在Tomcat/lib中文件夹或其他某个jar所需,该jar首先加载,但不包含所需的类。

原因可能是BouncyCastle在当前类加载器中注册,并且在重新启动web应用时卸载。您应该在JRE本身中注册BouncyCastle。请参见

原因可能是BouncyCastle向当前类加载器注册,并且在重新启动web应用程序时卸载。您应该在JRE本身中注册BouncyCastle。请参见

好提示,但不是。我的应用程序是唯一使用它的人。在tomcat libs中没有bouncycastle lib。你读过吗?很好的提示,但没有。我的应用程序是唯一使用它的。在tomcat libs中没有bouncycastle lib。你读过吗?