Vaadin / OSGi:找不到ScssStylesheet类

时间:2013-05-13 15:12:27

标签: java osgi sass vaadin

我使用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服务器的MANIFEST中添加DynamicImport-Package: *来“破解”vaadin服务器包。之前的异常没有出现,但我对org.w3c.css.sac.CSSException得到了相同的内容。

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

2 个答案:

答案 0 :(得分:2)

基于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,它从bundle资源加载,而不是(仅)filesystem / classloader作为默认实现。
  • 如果您在主题中导入部分原始主题,请考虑将其创建为com.vaadin.themes的片段,然后将其用作ScssStylesheetResolver的基础

答案 1 :(得分:1)

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

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