ClassNotFoundException с EHCache-Atomikos - PullRequest
       75

ClassNotFoundException с EHCache-Atomikos

2 голосов
/ 04 ноября 2010

Я пытаюсь использовать транзакционные способности EHCache вместе с Atomikos и Apache Tomcat (для использования с JMS и Hibernate, но это просто для уверенности скептиков, что мне действительно нужен JTA).

В настоящее время я работаю над небольшим POC, где я пытаюсь поместить экземпляр MyValue, который реализует Serializable, и когда я пытаюсь зафиксировать транзакцию, я получаю __ с ClassNotFoundException каккорень (трассировка стека находится в конце).

Когда я запускаю файл MyValue и помещаю его в% TOMCAT_HOME% \ lib, я не получаю исключения.

Важно добавить, что из-за инструкции, которую я видел в уроке atomikos , Jar-файлы Atomikos и EHCache находятся в% TOMCAT_HOME% \ lib.

Вот цитата:

Когда диспетчер транзакций Atomikos глобально установлен в Tomcat, теперь вы также должны установить драйвер JDBC в то же глобальное расположение (т. Е. В папку TOMCAT_HOME / lib).).Если вы этого не сделаете, вы получите NoClassDefFoundErrors или ClassNotFoundException или даже ClassCastException во время развертывания вашего веб-приложения.
Это не ограничение ни Atomikos, ни Tomcat, но не дизайн загрузки классов J2EE, который как Tomcat, так иАтомикос должен следовать.

Проблема в том, что я не могу иметь все свои классы значений в этой папке, конечно.

Я неправильно ввел инструкцию?

Кто-нибудь сталкивался с этой проблемой?

EHCache.xml

<cache name="myCache"  
       maxElementsInMemory="1000"  
       eternal="true"  
       overflowToDisk="false"  
       diskPersistent="false"  
       memoryStoreEvictionPolicy="LRU"  
        transactionalMode="xa"  
 />

трассировка стека

net.sf.ehcache.CacheException: When configured copyOnRead or copyOnWrite, a Store will only accept Serializable values  
at net.sf.ehcache.store.compound.SerializationCopyStrategy.copy(SerializationCopyStrategy.java:47)  
at net.sf.ehcache.store.compound.Segment.potentiallyCopy(Segment.java:176)  
at net.sf.ehcache.store.compound.Segment.create(Segment.java:342)  
at net.sf.ehcache.store.compound.Segment.put(Segment.java:400)  
at net.sf.ehcache.store.compound.CompoundStore.put(CompoundStore.java:132)  
at net.sf.ehcache.transaction.StorePutCommand.execute(StorePutCommand.java:43)  
at net.sf.ehcache.transaction.xa.VersionAwareWrapper.execute (VersionAwareWrapper.java:68)  
at net.sf.ehcache.transaction.xa.EhcacheXAResourceImpl.prepareInternal(EhcacheXAResourceImpl.java:224)  
at net.sf.ehcache.transaction.xa.TransactionXARequestProcessor$XARequestCallable.call(TransactionXARequestProcessor.java:150)  
at net.sf.ehcache.transaction.xa.TransactionXARequestProcessor$XARequestCallable.call(TransactionXARequestProcessor.java:117)  
at net.sf.ehcache.transaction.xa.XAThreadPool$MultiRunner.run(XAThreadPool.java:115)  
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441)  
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)  
at java.util.concurrent.FutureTask.run(FutureTask.java:138)  
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)  
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)  
at java.lang.Thread.run(Thread.java:619)  
Caused by: java.lang.ClassNotFoundException: com.myCompany.testJTA.MyValue  
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)  
at java.security.AccessController.doPrivileged(Native Method)  
at java.net.URLClassLoader.findClass(URLClassLoader.java:190)  
at java.lang.ClassLoader.loadClass(ClassLoader.java:307)  
at java.lang.ClassLoader.loadClass(ClassLoader.java:248)  
at java.lang.Class.forName0(Native Method)  
at java.lang.Class.forName(Class.java:247)  
at java.io.ObjectInputStream.resolveClass(ObjectInputStream.java:604)  
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1575)  
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1496)  
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1732)  
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)  
at java.io.ObjectInputStream.defaultReadFields(ObjectInputStream.java:1947)  
at java.io.ObjectInputStream.defaultReadObject(ObjectInputStream.java:480)  
at net.sf.ehcache.Element.readObject(Element.java:796)  
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)  
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)  
at sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)  
at java.lang.reflect.Method.invoke(Method.java:597)  
at java.io.ObjectStreamClass.invokeReadObject(ObjectStreamClass.java:974)  
at java.io.ObjectInputStream.readSerialData(ObjectInputStream.java:1849)  
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1753)  
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1329)  
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:351)  
at net.sf.ehcache.store.compound.SerializationCopyStrategy.copy (SerializationCopyStrategy.java:45)  
... 16 more  

1 Ответ

1 голос
/ 04 ноября 2010

Важно добавить, что из-за инструкции, которую я видел в учебнике по атомикосу, и банки Atomikos, и банки EHCache находятся в% TOMCAT_HOME% \ lib

Классы из веб-приложения (т. Е. Загруженные WebappX загрузчиком классов) не видны из Common загрузчика классов Apache Tomcat 6.0 - загрузчик классов HOW-TO ), поэтому вы получаете CNFE.

Теперь возникает вопрос: почему вы помещаете EHCache JAR в загрузчик классов Common ? Я не думаю, что вам нужно. Упакуйте его на уровне вашего веб-приложения.

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...