【发布时间】:2013-05-13 15:12:26
【问题描述】:
我使用 vaadin 和 OSGi 创建一个模块化应用程序。经过长时间的斗争,我能够成功部署应用程序。但是,我无法加载样式。当我尝试访问
http://localhost:8080/myapp/VAADIN/themes/myTheme/styles.css
我遇到了以下异常:
exception
javax.servlet.ServletException: Servlet execution threw an exception
root cause
java.lang.NoClassDefFoundError: com/vaadin/sass/internal/ScssStylesheet
com.vaadin.server.VaadinServlet.serveOnTheFlyCompiledScss(VaadinServlet.java:957)
com.vaadin.server.VaadinServlet.serveStaticResourcesInVAADIN(VaadinServlet.java:790)
com.vaadin.server.VaadinServlet.serveStaticResources(VaadinServlet.java:760)
com.vaadin.server.VaadinServlet.service(VaadinServlet.java:257)
com.vaadin.server.VaadinServlet.service(VaadinServlet.java:201)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
root cause
java.lang.ClassNotFoundException: com.vaadin.sass.internal.ScssStylesheet
org.eclipse.osgi.internal.loader.BundleLoader.findClassInternal(BundleLoader.java:501)
org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:421)
org.eclipse.osgi.internal.loader.BundleLoader.findClass(BundleLoader.java:412)
org.eclipse.osgi.internal.baseadaptor.DefaultClassLoader.loadClass(DefaultClassLoader.java:107)
java.lang.ClassLoader.loadClass(ClassLoader.java:356)
com.vaadin.server.VaadinServlet.serveOnTheFlyCompiledScss(VaadinServlet.java:957)
com.vaadin.server.VaadinServlet.serveStaticResourcesInVAADIN(VaadinServlet.java:790)
com.vaadin.server.VaadinServlet.serveStaticResources(VaadinServlet.java:760)
com.vaadin.server.VaadinServlet.service(VaadinServlet.java:257)
com.vaadin.server.VaadinServlet.service(VaadinServlet.java:201)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)[/code]
com.vaadin.sass.internal.ScssStylesheet 类由 vaadin-theme-compiler-7.x.x.jar 提供,但服务器不导入此包。然后,我通过在 vaadin 服务器的清单中添加 DynamicImport-Package: * 来“破解”vaadin 服务器包。之前的异常没有出现,但我对org.w3c.css.sac.CSSException 得到了相同的结果。
请注意,通过在 tomcat 上部署应用程序 .war 文件,我没有出错,并且应用程序看起来像我预期的那样(因为所有库都添加到 WEB-INF/lib 下,而 tomcat 将它们添加到类加载器上)。所以,问题出在纯 OSGi 上。
【问题讨论】: