代码之家  ›  专栏  ›  技术社区  ›  Ittai

EHCache Atomikos的ClassNotFoundException

  •  2
  • Ittai  · 技术社区  · 15 年前

    我正在研究一个小型的POC MyValue 哪些工具 Serializable 当我试图提交交易时 ClassNotFoundException 作为根(堆栈跟踪在末尾)。

    当我敲打

    由于我在 atomikos tutorial Atomikos的jar和EHCache jar都在%TOMCAT_HOME%\lib下。

    当Atomikos事务管理器在Tomcat中全局安装时,现在还必须在相同的全局位置安装JDBC驱动程序(即:安装到Tomcat_HOME/lib文件夹中)。如果不这样做,则在web应用程序部署期间将出现NoClassDefFoundErrors或ClassNotFoundException,甚至classcasteexception。
    这不是Atomikos和Tomcat的限制,而是Tomcat和Atomikos必须遵循的J2EE类加载设计的限制。

    我是不是看错了指令了?

    有人遇到过这个问题吗?

    <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 回复  |  直到 10 年前
        1
  •  1
  •   Pascal Thivent    15 年前

    由于我在atomikos教程中看到的一条指令,添加这一点很重要,atomikos的jar和EHCache jar都在%TOMCAT_HOME%\lib下

    WebappX 类加载器)在 类加载器(请参见 Apache Tomcat 6.0 - Class Loader HOW-TO ),这就是你得到CNFE的原因。

    现在,问题是,为什么要将EHCache JAR放在 类加载器?我觉得你不需要。在web应用程序级别打包它。

    工具书类