Deployment Wicket:避免ClassNotFoundException的最佳部署实践

Deployment Wicket:避免ClassNotFoundException的最佳部署实践,deployment,wicket,web-deployment,classnotfoundexception,wicket-6,Deployment,Wicket,Web Deployment,Classnotfoundexception,Wicket 6,我是wicket的新手,最近刚开始在一个新网站上使用它 我们的一个项目的应用程序。今天我遇到了一个类似的问题,比如 如中所述,在反序列化 页在我看来,有趣的是 提到缺课有一个很好的理由:我只是 进行了一些重构并重命名了类,重新部署并重新启动了我的 雄猫。对我来说,这看起来像是一个正常的用例,但对我来说却是一个问题 没想到我读过这些文件是因为 我的部署非常简单:我使用 包含整个应用程序的预配置标记 之后只需合并/更新并停止/启动web 服务器/应用程序 重构后,Wicket中的部署应该如何工作 或

我是wicket的新手,最近刚开始在一个新网站上使用它 我们的一个项目的应用程序。今天我遇到了一个类似的问题,比如 如中所述,在反序列化 页在我看来,有趣的是 提到缺课有一个很好的理由:我只是 进行了一些重构并重命名了类,重新部署并重新启动了我的 雄猫。对我来说,这看起来像是一个正常的用例,但对我来说却是一个问题 没想到我读过这些文件是因为

我的部署非常简单:我使用 包含整个应用程序的预配置标记 之后只需合并/更新并停止/启动web 服务器/应用程序

重构后,Wicket中的部署应该如何工作 或者以其他方式更改了有关缓存和序列化页面的类? 我有什么需要告诉wicket的吗?去清理每一个 部署还是忽略这些?我是否被迫不删除一次 在相当长的一段时间内部署课程?那会有点麻烦 噩梦。。。还是我遇到了其他我应该遇到的问题 避免

显然,其他人也会部署他们的Wicket应用程序,所以我希望你 对如何避免我遇到的问题有一些建议。谢谢

stacktrace的重要部分包括:

java.lang.ClassNotFoundException: de.am_soft.util.frontend.wicket.markup.link.LogoutLink
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720)
     at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
     at java.lang.Class.forName0(Native Method)
     at java.lang.Class.forName(Unknown Source)
     at org.apache.wicket.application.AbstractClassResolver.resolveClass(AbstractClassResolver.java:108)
     at org.apache.wicket.serialize.java.JavaSerializer$ClassResolverObjectInputStream.resolveClass(JavaSerializer.java:218)
     at java.io.ObjectInputStream.[...]
     at org.apache.wicket.serialize.java.JavaSerializer.deserialize(JavaSerializer.java:122)
     at org.apache.wicket.pageStore.DefaultPageStore.deserializePage(DefaultPageStore.java:396)
     at org.apache.wicket.pageStore.DefaultPageStore.getPage(DefaultPageStore.java:135)
     at org.apache.wicket.page.PageStoreManager$SessionEntry.getPage(PageStoreManager.java:203)
     at org.apache.wicket.page.PageStoreManager$PersistentRequestAdapter.getPage(PageStoreManager.java:360)
     at org.apache.wicket.page.AbstractPageManager.getPage(AbstractPageManager.java:107)

我也在上发布了这个问题,但还没有得到太多的回应,尽管我认为这是一个简单的问题…

Wicket是一个有状态的web框架,它存储页面实例,以方便浏览器和服务器之间的紧密用户交互。这意味着序列化每个页面的组件层次结构,以便用户可以与组件层次结构交互,修改它(例如替换面板),并期望客户端和服务器同步

当您重构类(例如重命名链接类)时,反序列化程序找不到该类,您将得到此ClassNotFoundException。要缓解此问题,请执行以下操作:

a。需要在浏览器中启动新会话,以便Wicket不会将浏览器与旧类的服务器状态绑定(扔掉jsessionid cookie),或者

b。在会话中构造新的页面实例(删除浏览器URL中的?0或?1231参数),或


c。清除服务器上的所有会话数据

(b)我的用户显然没有选择,(a)听起来我的用户无故注销,(c)意味着我必须处理Wickets自己的缓存文件结构,这是一个实现细节,可能会更改。其他用户真的是这样部署的吗?我自己的想法是:在DelegatingJavaSerializer中捕获(ClassNotFound/)RuntimeException,在这种情况下只返回“null”,然后让Wicket自动创建新的页面实例。在用户列表中有更详细的描述。现在你谈论的是用户而不是开发(你问题中的I)。不同的用例需要不同的解决方案。使用BookmarkablePageLinks在页面之间导航,以最大限度地降低访问过期URL的风险。不要在每次重构到生产环境时都部署一个新的应用程序(你的用户会感谢你),在集群中部署一个应用程序,让旧的会话在旧版本上饿死,然后将新会话发送到新的应用程序版本。关于你,我说的是“我”,我是部署的人,不管是不是生产环境。;-)我会记住BookmarkablePageLinks,谢谢,但是其他的解决方法对我来说并不是一个实用的解决方案。这意味着保留有缺陷的软件,而我们目前甚至根本不使用任何集群。我将尝试我的DelegatingJavaSerializer方法,并将了解它是如何工作的。想知道为什么Wicket会这么做。。。