2013-05-13 71 views
1

我使用vaadin和OSGi創建模塊化應用程序。經過長時間的戰鬥,我能夠成功部署應用程序。但是,我無法加載樣式。當我嘗試進入 http://localhost:8080/myapp/VAADIN/themes/myTheme/styles.css 我有以下異常:Vaadin/OSGi:找不到ScssStylesheet類

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主題編譯器,7.x.x.jar提供,但服務器不會導入這個包。然後,我通過在vaadin服務器的MANIFEST中添加DynamicImport-Package: *來「破解」vaadin服務器軟件包。以前的例外不會出現,但我得到的org.w3c.css.sac.CSSException相同。請注意,通過在tomcat上部署應用程序.war文件,我沒有錯誤,並且應用程序看起來像我期望的(因爲所有庫都添加到WEB-INF/lib下,而tomcat將它們添加到類加載器中)。所以,問題是純粹的OSGi。

回答

1

這聽起來像Vaadin中的包裝錯誤,應該向作者報告。如果核心Vaadin包需要訪問包com.vaadin.sass.internal中的類,那麼它應該在其Import-Package標頭中包含該類。

關於org.w3c.css.sac,您沒有指定哪個捆綁包會引發錯誤,但它聽起來像是同一類問題。無論哪個軟件包使用該軟件包,都應通過Import-Package導入。

+0

我注意到它在基地Vaadin論壇(線程[here](https://vaadin.com/forum#!/thread/3177168)。)。我有這個錯誤,因爲Vaadin在請求時試圖編譯styles.scss。在OSGi環境中,它不能很好地工作。所以我使用了一個編譯的主題(即:.css文件)。 – Mohammed 2013-05-14 07:02:15

2

基礎上,Vaadin 7.1.3捆綁,需要進行以下修改:

  • 進口com.vaadin.theme編譯在com.vaadin.server
  • 進口org.w3c.css .sac in com.vaadin.shared.deps和com.vaadin.theme編譯器
  • 通過ScssStylesheet.setStylesheetResolvers提供一個ScssStylesheetResolver,它從bundle資源加載,而不是(僅)文件系統/ classloader作爲默認實現。
  • 如果導入在你的主題原始主題的部分,考慮創建它作爲一個片段com.vaadin.themes,這反過來又可以被用來作爲ScssStylesheetResolver