【问题标题】:Vaadin/OSGi : ScssStylesheet class not foundVaadin/OSGi:未找到 ScssStylesheet 类
【发布时间】: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 上。

【问题讨论】:

    标签: java osgi sass vaadin


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我在 Vaadin 论坛中注意到了它(线程 here.)。我有这个错误是因为 Vaadin 试图在请求时即时编译 styles.scss。在 OSGi 环境中,它不能很好地工作。所以我使用了一个编译过的主题(即:.css 文件)。
      猜你喜欢
      • 2015-07-19
      • 2018-04-22
      • 1970-01-01
      • 2021-11-13
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-30
      相关资源
      最近更新 更多