User Tools

Site Tools


vaadin_7_osgi_web_application

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
Last revision Both sides next revision
vaadin_7_osgi_web_application [2014/03/11 15:13]
mihael
vaadin_7_osgi_web_application [2015/03/06 15:29]
mihael
Line 1: Line 1:
 ====== Vaadin 7 OSGi Web Application ====== ====== Vaadin 7 OSGi Web Application ======
-[[http://​vaadin.com | Vaadin 7]] is a Servlet based Java web framework. And as most OSGi container support Servlet based web applications very well. So this should be a match made in heaven. But their are some minor things one will stumble upon when trying to run a Vaadin application inside an OSGi container. One of those things is always the classpath.+ 
 +  Note: This was tested with Vaadin 7.3.3.  
 +        This guide cannot be used exactly as it is for Vaadin 7.4. 
 + 
 +[[http://​vaadin.com | Vaadin 7]] is a Servlet based Java web framework. And as most OSGi container support Servlet based web applications very well this should be a match made in heaven. But their are some minor things one will stumble upon when trying to run a Vaadin application inside an OSGi container. One of those things is always the classpath.
  
  
 ===== From Vaadin 6 to Vaadin 7 ===== ===== From Vaadin 6 to Vaadin 7 =====
-Some major changes have been made to the Vaadin API from version 6 to 7 but also some structural changes to the deployment. When Vaadin 6 was comfortable ​packaged into one jar Vaadin 7 comes with multiple jars. The Vaadin 6 jar didn't depend on any other jar which was very convenient. In contrast Vaadin 7 depends on dozens of other jars (some of them not OSGi ready out of the box).+Some major changes have been made to the Vaadin API from version 6 to 7 but also some structural changes to the deployment. When Vaadin 6 was comfortably ​packaged into one jar Vaadin 7 comes with multiple jars. The Vaadin 6 jar didn't depend on any other jar which was very convenient. In contrast Vaadin 7 depends on dozens of other jars (some of them not OSGi ready out of the box).
  
  
Line 20: Line 24:
 Maven and the Maven Bundle Plugin (and some other plugins) are used for development. Maven and the Maven Bundle Plugin (and some other plugins) are used for development.
  
-==== VaadinServlet ​==== +==== Application Code ==== 
-The VaadinServlet class is used to register ​the web application ​at the servlet container. Due to a classpath problem a class extending VaadinServlet must be created so that the bundle can resolve all needed classes.+To get the application ​code from the source code repository just clone it with hg (Mercurial):​
  
-<sxh java title=OsgiVaadinServlet>​ +  hg clone http://​hg.code.sf.net/​u/​fist/​test.vaadin7 ​test.vaadin7
-package ​test.vaadin7;+
  
-import com.vaadin.server.VaadinServlet;+=== VaadinServlet === 
 +The VaadinServlet class is used to register the web application at the servlet containerDue to a classpath problem a class extending ​VaadinServlet ​must be created so that the bundle can resolve all needed classes.
  
 +<sxh java title=OsgiVaadinServlet>​
 public class OsgiVaadinServlet extends VaadinServlet { public class OsgiVaadinServlet extends VaadinServlet {
  
     private static final long serialVersionUID = -4733496883901044844L;​     private static final long serialVersionUID = -4733496883901044844L;​
  
 +    @Override
 +    protected VaadinServletService createServletService(DeploymentConfiguration deploymentConfiguration)
 +                    throws ServiceException {
 +
 +        VaadinServletService service = new VaadinServletService(this,​ deploymentConfiguration) {
 +            private static final long serialVersionUID = 1L;
 +
 +            @Override
 +            public ClassLoader getClassLoader() {
 +                return OsgiVaadinServlet.class.getClassLoader();​
 +            }
 +
 +            @Override
 +            protected List<​RequestHandler>​ createRequestHandlers() throws ServiceException {
 +                ClassLoader actual = Thread.currentThread().getContextClassLoader();​
 +                try {
 +                    Thread.currentThread().setContextClassLoader(DefaultBroadcaster.class.getClassLoader());​
 +                    return super.createRequestHandlers();​
 +                }
 +                finally {
 +                    Thread.currentThread().setContextClassLoader(actual);​
 +                }
 +            }
 +        };
 +        ​
 +        service.init();​
 +        ​
 +        return service;
 +    }
 } }
 </​sxh>​ </​sxh>​
  
-==== web.xml ​====+=== web.xml ===
 The registration of the servlet is done via the //web.xml// file (annotations didn't work). The registration of the servlet is done via the //web.xml// file (annotations didn't work).
  
Line 67: Line 101:
  
  
-==== Maven Bundle Plugin ​====+=== Maven Bundle Plugin ===
 The Maven Bundle Plugin takes care of all things related to the building of a bundle with the needed entries in the manifest file. Just add it to the pom.xml. The Maven Bundle Plugin takes care of all things related to the building of a bundle with the needed entries in the manifest file. Just add it to the pom.xml.
  
Line 111: Line 145:
 </​sxh>​ </​sxh>​
  
 +==== vaadinbootstrap.js ====
 +The file //​vaadinbootstrap.js//​ is located in the //​vaadin-server//​ jar in the folder //VAADIN//. The file should be copied from the vaadin-server jar to the folder ''​src/​main/​webapp/​VAADIN/''​.
 +
 +==== Classpath ====
 +Vaadin expects some things to be on the classpath of the application,​ like themes and compiled resources. To get this working in a simple way is to include these in the war (see Embed-Dependency in pom.xml) and add them to the Bundle-ClassPath entry in the manifest file.
 +
 +  Bundle-ClassPath:​ .,​WEB-INF/​classes/,​WEB-INF/​lib/​vaadin-themes-7.3.3.jar,​WEB-INF/​lib/​vaadin-client-compiled-7.3.3.jar
 +  ​
 ===== Building ===== ===== Building =====
 Building the web application bundle with maven is no more than doing a  Building the web application bundle with maven is no more than doing a 
Line 116: Line 158:
   mvn clean package   mvn clean package
  
-The target folder ​should contain ​the bundle (war) file. +The "target" ​folder ​contains ​the bundle (war) file. 
  
 ===== Deployment ===== ===== Deployment =====
  
 ==== Apache Karaf ==== ==== Apache Karaf ====
 +For the testing purpose I am using Apache Karaf 3.0.0 which is the latest stable version of Apache Karaf and can be downloaded from the Apache Karaf website.
 +
 +Karaf is a very easy to manage OSGi container. Just unpack the archive and start it with
 +
 +  bin/karaf
 +
 +The bundles can be dumped into the deploy folder which will automatically start the bundles.
  
 === Installing Prerequisites === === Installing Prerequisites ===
 +
 +The //war// feature need to be installed with the command
 +
 +  feature:​install war
 +  ​
 +Now drop all the dependencies into the deploy folder and you are ready to proceed.
  
 === Installing Vaadin === === Installing Vaadin ===
 +Sadly not all libraries delivered with the Vaadin All-In-One archive are provided with a valid OSGi manifest header. But for most use cases a subset of libraries is sufficient enough. For this demo only the following libraries are needed:
  
-=== Installing Demo ===+  * json-0.0.20080701.jar ​        
 +  * flute-1.3.0.gg2.jar ​          
 +  * atmosphere-runtime-2.1.2.vaadin6.jar 
 +  * org.apache.commons.beanutils-1.8.3.jar ​                
 +  * org.apache.commons.codec-1.7.0.jar ​           
 +  * org.apache.commons-collections-3.2.1.jar ​     
 +  * org.apache.commons.io-2.4.0.jar ​              
 +  * org.apache.commons.lang3-3.1.0.jar ​           
 +  * vaadin-slf4j-jdk14-1.6.1.jar 
 +  * jsoup-1.6.3.jar ​                    
 +  * guava-16.0.1.vaadin1.jar ​              
 +  * streamhtmlparser-jsilver-0.0.10.vaadin1.jar 
 +  * vaadin-shared-7.3.3.jar 
 +  * vaadin-server-7.3.3.jar 
 +  * vaadin-client-7.3.3.jar
  
-==== Eclipse Equinox ====+<note tip>Some of the libraries in the Vaadin archive have no OSGi manifest header entries, check for Bundle-* entries. OSGi versions of these libraries can be downloaded here (TODO) or from the [[http://​search.maven.org | Maven Repository]].</​note>​
  
-=== Installing Prerequisites ===+<note important>​The Vaadin All-In-One archive comes with an incompatible json library. The bundle version of the library is not what the rest of the vaadin library expects. The Bundle-Version and the version on the Export-Package entry needs to be updated to something like 0.0.20141029
  
-=== Installing Vaadin ===+  Export-Package:​ org.json;​version="​0.0.20141029"​ 
 +  Bundle-Version:​ 0.0.20141029 
 +</​note>​
  
 === Installing Demo === === Installing Demo ===
 +Just copy the test.vaadin-x.x.x.war to the deploy folder and you are done. The web application is available under the path which is specified in the manifest with the //​Web-ContextPath//,​ in this example ''/​test.vaadin7''​.
 +
 +So point the browser to ''​http://​localhost:​8181/​test.vaadin7''​.
 +=== Checking the web application ===
 +Apache Karaf uses Jetty as its HTTP server. By default it uses the port 8181. You can check this by either pointing your browser to http://​localhost:​8181 or by using netstat.
 +
 +  netstat -an | grep 8181
 +  ​
 +A good place to start looking for your application is always the log, see karaf/​data/​logs/​karaf.log.
 +
 +Another nice method is by using the Apache Felix Webconsole. You can install it with ''​feature:​install webconsole''​. Then go to http://​localhost:​8181/​system/​console/​http . There you will see the installed WABs.
 +
 +
 +===== Stylesheet Compiling =====
 +If a CSS style is used or one of the predefined styles then everything is alright and should work. But if you are using your own style (or extending an existing one) than normally Vaadin would compile it on the fly during the first call of the servlet. But that ends in a nice error message.
 +
 +  java.lang.NoClassDefFoundError:​ com/​vaadin/​sass/​internal/​ScssStylesheet
 +  ​
 +But the Book of Vaadin explains nicely how to compile the stylesheet before the deployment.
 +
 +For myself the easiest way was to manually compile it with the following command
  
 +  java -cp "/​my/​path/​to/​vaadin-all-7.3.3/​lib/​*":"/​my/​path/​to/​vaadin-all-7.3.3/​*"​ com.vaadin.sass.SassCompiler styles.scss styles.css
  
 +  ​
 ===== Open Questions ===== ===== Open Questions =====
 The Vaadin Push support has been tested in this setup. It may need some additional classes which has to be available on the bundle classpath. The Vaadin Push support has been tested in this setup. It may need some additional classes which has to be available on the bundle classpath.
Line 143: Line 238:
 ===== Source Code ===== ===== Source Code =====
   * {{::​pom.xml| Maven pom.xml file for OSGi Web Application Bundles}}   * {{::​pom.xml| Maven pom.xml file for OSGi Web Application Bundles}}
-  * [[https://​sourceforge.net/​u/​fist/​test.vaadin7/​ci/​default/​tree/​ | Vaadin 7 OSGi Web App Test Case - Source]]+  * [[https://​sourceforge.net/​u/​fist/​test.vaadin7/​ci/​default/​tree/​ | Vaadin 7 OSGi Web App Test Case - Source ​Code Repository]]
  
  
Line 154: Line 249:
  
  
-{{tag>​devel java}}+{{tag>​devel java vaadin}}
vaadin_7_osgi_web_application.txt · Last modified: 2015/04/29 13:37 by mihael