我有一个带有Liferay 6.2安装的tomcat集群环境。每个tomcat都部署了许多基于Spring的portlet应用程序。我的问题是当会话复制进程正在运行时,我得到与我的portlet的自定义类相关的ClassNotFoundException。调查这个问题我发现它是由Tomcat核心类加载器中运行的会话复制过程引起的,我在会话中保存的自定义类是在自定义portlet类加载器中加载的。
2016年10月7日下午1:42:08 org.apache.catalina.session.StoreBase processExpires
严重:会议:EA336308A2FDB389CA636EDFC537BEB6.lfrtc1; java.lang.ClassNotFoundException:com.pullmantur.portal.cruise.web.result.model.vo.CruiseSearchForm 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) 在org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:278) at org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:74) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1612) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1517) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1771) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1350) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:370) 在org.apache.catalina.session.StandardSession.readObject(StandardSession.java:1619) at org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1084) 在org.apache.catalina.session.JDBCStore.load(JDBCStore.java:657) 在org.apache.catalina.session.StoreBase.processExpires(StoreBase.java:157) at org.apache.catalina.session.PersistentManagerBase.processExpires(PersistentManagerBase.java:449) 在org.apache.catalina.session.ManagerBase.backgroundProcess(ManagerBase.java:566) 在org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1352) at org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1546) at org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) at org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.processChildren(ContainerBase.java:1556) 在org.apache.catalina.core.ContainerBase $ ContainerBackgroundProcessor.run(ContainerBase.java:1524) 在java.lang.Thread.run(Thread.java:745)
有人可以帮我解决这个问题吗?
答案 0 :(得分:0)
如果是这种情况并且会话复制与应用程序类路径完全分离,则需要将类(Tomcat无法找到的类)添加到Tomcat的Common类加载器中(explained here)。
最好只使用POJO将这些类分成单独的jar。
否则,您可以将对象存储为更一般的对象(例如BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
PROJECT_ROOT = os.path.dirname(os.path.abspath(__file__))
STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static')
#STATIC_URL = '/static/'
STATICFILES_DIRS = (
os.path.join(PROJECT_ROOT, 'staticfiles'),
)
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
STATIC_URL = '/static/'
)。