1

我使用 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.xxjar 提供,但服务器不导入此包。DynamicImport-Package: *然后,我通过添加vaadin 服务器的清单来“破解”vaadin 服务器包。前面的异常没有出现,但我得到了相同的org.w3c.css.sac.CSSException.

请注意,通过在 tomcat 上部署应用程序 .war 文件,我没有出错,并且应用程序看起来像我预期的那样(因为所有库都添加到 WEB-INF/lib 下,而 tomcat 将它们添加到类加载器上)。所以,问题是纯粹的 OSGi。

4

2 回答 2

2

基于 Vaadin 7.1.3 捆绑包,需要进行以下更改:

  • 在 com.vaadin.server 中导入 com.vaadin.theme-compiler
  • 在 com.vaadin.shared.deps 和 com.vaadin.theme-compiler 中导入 org.w3c.css.sac
  • 通过从捆绑资源加载的 ScssStylesheetResolver 提供一个 ScssStylesheetResolver,而不是(仅)作为默认实现的文件系统/类加载器。
  • 如果您在主题中导入部分原始主题,请考虑将其创建为 com.vaadin.themes 的片段,然后可以将其用作 ScssStylesheetResolver 的基础
于 2013-08-22T19:59:39.013 回答
1

这听起来像是 Vaadin 中的一个打包错误,应该向作者报告。如果核心 Vaadin 包需要访问包中的类,com.vaadin.sass.internal那么它应该将其包含在其Import-Package头文件中。

关于org.w3c.css.sac,您没有指定哪个包会引发错误,但这听起来像是同一种问题。无论哪个包使用该包,都应该通过 Import-Package 导入它。

于 2013-05-13T16:38:23.330 回答