java NoClassDefFoundError但是Class是可用的

时间:2016-04-04 11:29:02

标签: java liferay classloader liferay-6 noclassdeffounderror

我有一个非常奇怪的(对我而言)问题。我使用充气城堡来解密/隐藏Web应用程序中的一些邮件。重新部署我的应用程序后,我得到了这个例外

  

java.lang.NoClassDefFoundError:org / bouncycastle / jcajce / spec / SkeinParameterSpec           at org.bouncycastle.jcajce.provider.symmetric.util.BaseMac.engineInit(Unknown Source)           在javax.crypto.Mac.init(Mac.java:443)           at org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.calculatePbeMac(Unknown Source)           在org.bouncycastle.jcajce.provider.keystore.pkcs12.PKCS12KeyStoreSpi.engineLoad(未知来源)           在java.security.KeyStore.load(KeyStore.java:1445)           在 my.application.Class .getDecryptedContent( my.application.Class .java:401)           at 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)           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)           at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)           at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)           在java.lang.reflect.Method.invoke(Method.java:497)           在org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:273)           在org.springframework.scheduling.support.MethodInvokingRunnable.run(MethodInvokingRunnable.java:65)           在org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:51)           在org.springframework.scheduling.concurrent.ReschedulingRunnable.run(ReschedulingRunnable.java:81)           at 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)           at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)           在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)           at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)           在java.lang.Thread.run(Thread.java:745)

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

奇怪的是:如果我使用此类代码直接使用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以上面的异常结束。

有人可以帮我理解为什么会这样?

P.S .: 这只发生在重新部署之后,如果每次认为重新启动整个Tomcat都会发生。

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

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

解决方案: 请参阅正确答案的'inigo skimmer'评论。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:-2)

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