【问题标题】:Vaadin Charts -ClassNotFoundException: com.vaadin.ui.AbstractComponentVaadin 图表 -ClassNotFoundException:com.vaadin.ui.AbstractComponent
【发布时间】:2015-04-22 22:54:02
【问题描述】:

我编写了一个可以在 tomcat 服务器上运行并显示 vaadin 图表的小型演示网络应用程序。

当我重新启动服务器并首次加载应用程序时,它可以工作。一旦我对代码进行了更改并且应该自动重新部署应用程序,我就会在下面得到一个 ClassNotFoundException: com.vaadin.ui.AbstractComponent 异常。我重新编译了小部件集,因为图表需要这个。

在添加图表之前这没有问题,所以我认为图表组件缺少某些东西,但是当我重新启动服务器时它可以工作,这让我感到困惑。

在不更改图表特定代码的情况下,我是否也需要不断重新编译图表?我需要如何调整 ivy 文件来实现这一点?

注释:

@VaadinServletConfiguration(productionMode = false, ui = DerstandarduseranalyzerUI.class, widgetset = "com.example.derstandarduseranalyzer.widgetset.DerstandarduseranalyzerWidgetset")

小部件集 gwt

<inherits name="com.vaadin.DefaultWidgetSet" />
<inherits name="com.vaadin.addon.charts.Widgetset" />
<inherits name="com.vaadin.addon.timeline.gwt.TimelineWidgetSet" />

ivy.xml

<?xml version="1.0"?>
<!DOCTYPE ivy-module [
<!ENTITY vaadin.version "7.4.4">
 ]>
<ivy-module version="2.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://ant.apache.org/ivy/schemas/ivy.xsd">
<info organisation="com.example" module="v7proj" />
<configurations>

<conf name="default" />

<conf name="widgetset-compile" />

<conf name="nodeploy" />
</configurations>
<dependencies defaultconf="default" defaultconfmapping="default->default">
<dependency org="com.vaadin" name="vaadin-server" rev="&vaadin.version;" />
<dependency org="com.vaadin" name="vaadin-themes" rev="&vaadin.version;" />
<dependency org="com.vaadin" name="vaadin-push" rev="&vaadin.version;"     conf="default->default"/>
<dependency org="javax.servlet" name="javax.servlet-api" rev="3.0.1" conf="nodeploy->default" />
<dependency org="com.vaadin" name="vaadin-testbench-api" rev="latest.release" conf="nodeploy -> default" />
<dependency org="com.vaadin" name="vaadin-client-compiled"
rev="&vaadin.version;" />
<dependency org="com.vaadin" name="vaadin-client" rev="&vaadin.version;" conf="widgetset-compile->default" />
<dependency org="com.vaadin" name="vaadin-client-compiler"   rev="&vaadin.version;" conf="widgetset-compile->default" />
</dependencies>
</ivy-module>

ivysettings.xml

 <?xml version="1.0" encoding="UTF-8"?>
 <ivysettings>
 <settings defaultResolver="default" />
 <resolvers>
 <chain name="default">

 <ibiblio name="public" m2compatible="true" />
 <ibiblio 
 name="vaadin-addons" 
 usepoms="true" 
 m2compatible="true" 
 root="http://maven.vaadin.com/vaadin-addons" />

 <ibiblio name="vaadin-addons" usepoms="true" m2compatible="true"
 root="http://maven.vaadin.com/vaadin-addons" />


 <ibiblio name="vaadin-snapshots" usepoms="true" m2compatible="true"
 root="https://oss.sonatype.org/content/repositories/vaadin-snapshots" />

 <dual name="custom-smartsprites">
 <filesystem name="smartsprites-ivy">
 <ivy pattern="${basedir}/ivymodule/[module]-ivy-[revision].xml" />
 </filesystem>
 <url name="smartsprites-artifact">
 <artifact
 pattern="http://dev.vaadin.com/svn/versions/6.8/build/smartsprites/lib/[artifact](-[revision]).[ext]" />
 </url>
 </dual>
 </chain>
 </resolvers>
 <modules>

 <module organisation="com.carrotsearch" name="smartsprites"
 revision="0.2.3-itmill" resolver="custom-smartsprites" />
 </modules>


 </ivysettings>

错误

2015 年 4 月 22 日晚上 11:31:54 org.apache.catalina.core.StandardContext 重新加载信息:使用名称 [/derStandardUserAnalyzer] 重新加载上下文 已于 2015 年 4 月 22 日晚上 11:31:54 开始 org.apache.catalina.loader.WebappClassLoaderBase checkThreadLocalMapForLeaks SEVERE:Web 应用程序 [/derStandardUserAnalyzer] 创建了一个具有类型键的 ThreadLocal [com.google.gson.Gson$1](价值 [com.google.gson.Gson$1@e7f068c])和 [java.util.HashMap] 类型的值(值 [{}])但未能删除 当 Web 应用程序停止时。线程将是 随着时间的推移更新以尝试避免可能的内存泄漏。 4月22日, 2015 年 11:31:54 PM org.apache.jasper.servlet.TldScanner scanJars 信息: 至少对一个 JAR 进行了 TLD 扫描,但未包含 TLD。使能够 调试此记录器的日志记录以获得完整的 JAR 列表 扫描但未在其中找到 TLD。期间跳过不需要的 JAR 扫描可以提高启动时间和 JSP 编译时间。 4月22日, 2015 年 11:31:54 PM org.apache.catalina.session.StandardManager startInternal SEVERE:来自持久性的异常加载会话 存储 java.lang.NoClassDefFoundError: com/vaadin/ui/AbstractComponent 在 java.lang.ClassLoader.defineClass1(本机方法)在 java.lang.ClassLoader.defineClass(未知来源)在 java.security.SecureClassLoader.defineClass(未知来源)在 org.apache.catalina.loader.WebappClassLoaderBase.findClassInternal(WebappClassLoaderBase.java:2450) 在 org.apache.catalina.loader.WebappClassLoaderBase.findClass(WebappClassLoaderBase.java:852) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1262) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1145) 在 java.lang.Class.forName0(Native Method) 在 java.lang.Class.forName(未知来源)在 org.apache.catalina.util.CustomObjectInputStream.resolveClass(CustomObjectInputStream.java:74) 在 java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 在 java.io.ObjectInputStream.readClassDesc(Unknown Source) 在 java.io.ObjectInputStream.readClass(Unknown Source) 在 java.io.ObjectInputStream.readObject0(未知来源)在 java.io.ObjectInputStream.skipCustomData(未知来源)在 java.io.ObjectInputStream.readSerialData(未知来源)在 java.io.ObjectInputStream.readOrdinaryObject(未知来源)在 java.io.ObjectInputStream.readObject0(未知来源)在 java.io.ObjectInputStream.defaultReadFields(未知来源)在 java.io.ObjectInputStream.readSerialData(未知来源)在 java.io.ObjectInputStream.readOrdinaryObject(未知来源)在 java.io.ObjectInputStream.readObject0(未知来源)在 java.io.ObjectInputStream.defaultReadFields(未知来源)在 java.io.ObjectInputStream.readSerialData(未知来源)在 java.io.ObjectInputStream.readOrdinaryObject(未知来源)在 java.io.ObjectInputStream.readObject0(未知来源)在 java.io.ObjectInputStream.readObject(Unknown Source) 在 org.apache.catalina.session.StandardSession.doReadObject(StandardSession.java:1634) 在 org.apache.catalina.session.StandardSession.readObjectData(StandardSession.java:1099) 在 org.apache.catalina.session.StandardManager.doLoad(StandardManager.java:261) 在 org.apache.catalina.session.StandardManager.load(StandardManager.java:180) 在 org.apache.catalina.session.StandardManager.startInternal(StandardManager.java:460) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5238) 在 org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 在 org.apache.catalina.core.StandardContext.reload(StandardContext.java:3821) 在 org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:292) 在 org.apache.catalina.core.StandardContext.backgroundProcess(StandardContext.java:5576) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1377) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1381) 在 org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1349) 在 java.lang.Thread.run(Unknown Source) 引起: java.lang.ClassNotFoundException:com.vaadin.ui.AbstractComponent 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1293) 在 org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1145)

【问题讨论】:

  • 只需要编译一个widgetset,在开发过程中你不需要这样做(除非你自己开发插件)。

标签: java tomcat gwt vaadin ivy


【解决方案1】:

我也时常会遇到这种情况。不是与 Vaadin 相关的问题,而是容器的问题。基本上不更新了。通常重启机器(它可能挂在某个地方)会有所帮助;一个快速的替代方法是执行“项目>清除”并在您用于运行/调试(服务器选项卡)的服务器上“右键单击>清除”。 每次都这样做有点烦人,但对我有用。

【讨论】:

  • 谢谢 - 我会在家里尝试,但如果我每次都需要这样做,我并不认为这是一个解决方案,因为我已经在重新启动解决它的 tomcat。我也尝试清除服务器和项目,但我总是需要重新启动它。
  • 哦,等等,你不能推送运行时类的另一个版本!当然,您必须重新启动服务器:当 JVM 启动时,它会放置一种 .class 的“缓存”版本,并且不能“热”修改或“instanceof”之类的东西会中断。这是使用 java 使用 webapp 容器的唯一不好的方面 ;-)
  • 谢谢!但是,为什么它只在 UI/应用程序的核心上工作,而在添加图表组件后就中断了?
  • 现在,这是一个有趣的问题。可能在简单的情况下,带有 Vaadin 的类加载器能够进行这种热交换,而添加插件可能不会。无论如何,如果您对热交换感兴趣,可以查看 HotSwap JVM 工具(免费)或 jrebel(商业)
猜你喜欢
  • 2014-12-03
  • 2011-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-03
相关资源
最近更新 更多