【问题标题】:ClassNotFoundException with EHCache-AtomikosClassNotFoundException 与 EHCache-Atomikos
【发布时间】:2010-11-04 16:08:30
【问题描述】:

我正在尝试将 EHCache 的事务能力与 Atomikos 和 Apache Tomcat 一起使用(用于 JMS 和 Hibernate,但这只是为了向怀疑者保证我真的需要 JTA)。

我目前正在开发一个小型 POC,我正在尝试放置一个实现 SerializableMyValue 实例,当我尝试提交事务时,我得到了以 ClassNotFoundException 为根的 __ (堆栈跟踪在最后)。

当我 jar 文件 MyValue 并将其放在 %TOMCAT_HOME%\lib 下时,我没有例外。

由于我在atomikos tutorial 上看到的一条指令,Atomikos 的 jar 和 EHCache jar 都在 %TOMCAT_HOME%\lib 下,因此重要的是要补充。

这是引用:

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

当然,问题是我不能将所有值类都放在该文件夹下。

我是否误输入了指令?

有人遇到过这个问题吗?

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  

【问题讨论】:

    标签: java tomcat ehcache jta atomikos


    【解决方案1】:

    重要的是要补充一点,因为我在 atomikos 教程上看到了 Atomikos 的 jar 和 EHCache jar 都在 %TOMCAT_HOME%\lib 下的说明

    Web 应用程序中的类(即由 WebappX 类加载器加载)在 Common中不可见> 类加载器(请参阅Apache Tomcat 6.0 - Class Loader HOW-TO),这就是您获得 CNFE 的原因。

    现在的问题是,为什么要将 EHCache JAR 放在 Common 类加载器中?我不认为你需要。在您的 Web 应用程序级别打包它。

    参考文献

    【讨论】:

    • 嗨帕斯卡,你引用的是我所怀疑的(因此我成功地解决了问题)。 EHCache jar 位置的动机在上面提到了一个关于 atomikos 教程的链接
    • @Ittai:嗯,如果你想使用Tomcat的连接池,你需要把JDBC驱动(以及提供AtomikosDataSourceBean的jar,即Atomikos)放在Common classloader中(原因上面提到) .但是 EHCache 的情况不同,Tomcat 和 Atomikos 都没有实例化 EHCache 的东西。只需将其放在应用级别即可。
    • 非常感谢。我怀疑我错误地概括了评论,但由于我对应用服务器不太熟悉,所以我不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2023-03-03
    • 2012-12-11
    • 1970-01-01
    • 2015-01-09
    相关资源
    最近更新 更多