User Tools

Site Tools


vaadin_7_osgi_web_application

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Vaadin 7 OSGi Web Application ====== Note: This was tested with the latest Vaadin release (7.3.3). [[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 ===== 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). ===== OSGi Web Application Packaging ===== OSGi Web Applications are called WAB ⇒ **W**eb **A**pplication **B**undle. Same as a bundle is just a jar file with an extended manifest file the same goes for the WAB. A web application bundle is just a WAR file with an extended manifest. ===== Demo Vaadin 7 OSGi Web Applicaton ===== The demo application is a stripped barebone Vaadin application. It uses the default widgetset and the default Vaadin Reindeer theme. It is derived from the Vaadin application maven archetype and just shows a button which will display a message on click. ===== Development ===== Maven and the Maven Bundle Plugin (and some other plugins) are used for development. ==== Application Code ==== To get the application code from the source code repository just clone it with hg (Mercurial): hg clone http://hg.code.sf.net/u/fist/test.vaadin7 test.vaadin7 <note warning>Not updated yet!</note> === VaadinServlet === 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. <sxh java title=OsgiVaadinServlet> public class OsgiVaadinServlet extends VaadinServlet { 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> === web.xml === The registration of the servlet is done via the //web.xml// file (annotations didn't work). <sxh xml> <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> <servlet> <servlet-name>vaadin_servlet</servlet-name> <servlet-class>test.vaadin7.OsgiVaadinServlet</servlet-class> <init-param> <param-name>UI</param-name> <param-value>test.vaadin7.MyVaadinUI</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>vaadin_servlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app> </sxh> <note>Don't forget to specify your own VaadinServlet class in the web.xml file.</note> === 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. <sxh xml> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.3.6</version> <extensions>true</extensions> <executions> <execution> <id>bundle-manifest</id> <phase>process-classes</phase> <goals> <goal>manifest</goal> </goals> </execution> <execution> <id>bundle-install</id> <phase>install</phase> <goals> <goal>install</goal> </goals> </execution> </executions> <configuration> <supportedProjectTypes> <supportedProjectType>ejb</supportedProjectType> <supportedProjectType>war</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>jar</supportedProjectType> </supportedProjectTypes> <instructions> <!-- Read all OSGi configuration info from this optional file --> <_include>-osgi.properties</_include> <Bundle-PresentationName>${project.artifactId}</Bundle-PresentationName> <Embed-Directory>WEB-INF/lib</Embed-Directory> <Embed-Dependency>*;scope=compile</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> </instructions> </configuration> </plugin> </sxh> ===== Building ===== Building the web application bundle with maven is no more than doing a mvn clean package The target folder should contain the bundle (war) file. ===== Deployment ===== ==== 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 === 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 === 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: * 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 <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> <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 Export-Package: org.json;version="0.0.20141029" Bundle-Version: 0.0.20141029 </note> === Installing Demo === Just copy the test.vaadin-x.x.x.war to the deploy folder are 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. ===== 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. ===== Source Code ===== * {{::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 Code Repository]] ===== Links ===== * [[http://vaadin.com | Vaadin]] * [[https://vaadin.com/wiki/-/wiki/Main/Creating+a+Modular+Vaadin+Application+with+OSGi | Vaadin Wiki - Creating a Modular Vaadin Application with OSGi]] * [[http://sourceforge.net/u/fist/modular/ci/default/tree/ | Vaadin 6 Modular Application - Web Launcher]] * [[http://felix.apache.org/site/apache-felix-maven-bundle-plugin-bnd.html | Maven Bundle Plugin]] * [[http://karaf.apache.org | Apache Karaf]] {{tag>devel java vaadin}}

vaadin_7_osgi_web_application.1414685054.txt.gz · Last modified: 2014/10/30 16:04 by mihael