Documentation

Documentation versions (currently viewingVaadin 23)

Using Vaadin With Karaf

The Karaf http feature along with the war feature provides an implementation of HTTP Whiteboard, which is the standard in Karaf in practice. This implementation is known as PAX Web (see HTTP feature details here). PAX Web is not fully compliant with the HTTP Whiteboard OSGi Compendium 7 specification. There are some issues related to ServletContextListener support. Because of these issues, the recommended way of registering VaadinServlet, described in the generic Using Vaadin with OSGi tutorial, does not work in PAX Web.

Nevertheless, it is still possible to use Vaadin OSGi support with PAX Web. But the OSGiVaadinServlet should be used as a base class for the servlet which is registered in an OSGi bundle:

@org.osgi.service.component.annotations.Component(service = Servlet.class)
@HttpWhiteboardServletAsyncSupported
@HttpWhiteboardServletPattern("/*")
public class FixedVaadinServlet extends OSGiVaadinServlet {

    @Override
    protected void servletInitialized() throws ServletException {
        getService().setClassLoader(getClass().getClassLoader());
    }

}

Refer to the generic Using Vaadin with OSGi and Using Services With Vaadin tutorials for other non-Karaf-specific Vaadin OSGi documentation.

Karaf Base Starter

A Karaf base starter project is available at https://github.com/vaadin/base-starter-flow-karaf.

The project may be used as a basis for a custom OSGi Vaadin web bundle project. The README contains information on how to run Karaf, install all the required Karaf features, and install project features to an existing Karaf container.

The base project generated feature Maven artifact classifier contains all the dependencies for the project and can be used as a basis for a custom project "feature". A few Karaf features are already provided by Vaadin (see below).

Karaf Features

One of the most important questions that needs to be addressed when an OSGi bundle is deployed to the OSGi container is the resolution of the bundle dependencies. Even if it is deployed, the bundle does not work in the OSGi container until all its dependencies are resolved. Karaf allows you to solve this via the "feature" concept; bundles can be combined into a "feature" that contains all the dependency bundles and can be installed as one unit.

Vaadin provides several features which can be used depending on requirements:

  • flow-server

  • flow-data

  • flow-osgi

  • flow

  • vaadin-core

  • vaadin

The flow-server feature contains the minimum dependencies that have to be added to any Vaadin web project. The flow-osgi feature contains the necessary dependency for a Vaadin OSGi web bundle. The flow feature combines all Flow bundles altogether and it is convenient when you use all Flow modules in your project. However, it may be too big for your purposes (some bundles can be excluded from it).

A similar situation arises with vaadin-core and vaadin features; they combine all Flow bundles (including the flow feature) plus all Vaadin components. The first one contains all the free components; the second one includes free and commercial components. These features can be used as they are, if you want to deploy everything to the Karaf container and are not concerned with anything else. But it is also possible to use the features as a base for a custom feature.

The feature can be installed into the Karaf container with two commands:

karaf@root()> feature:repo-add mvn:com.vaadin/flow/$FLOW_VERSION$/xml/features
karaf@root()> feature:install flow

Here, $FLOW_VERSION$ is a placeholder for the Flow artifact version value. The first command uses the feature Maven classifier to add a feature repository (which is an XML file with a feature declaration). The second command installs the feature which is declared in the added repository. Here is an example of the feature repository.

The same can be done with any of the features mentioned.

It might sometimes be useful to install a bundle without a feature. This can be done like this:

karaf@root()> bundle:install mvn:com.vaadin/flow-html-components/$FLOW_VERSION$
karaf@root()> bundle:install mvn:com.vaadin/vaadin-text-field-flow/$TEXT_FIELD_VERSION$

The command refers to the Maven artifact via the com.vaadin group ID, flow-html-components (vaadin-text-field-flow) artifact ID and the artifact version.