This project demonstrates how you can build modular web applications using Vaadin Flow and Apache Karaf. The project can also be used as a starting point to create your own Vaadin Flow application bundle for Karaf.
For more Vaadin usage samples, you can go to vaadin.com/start.
To access the project directly from github, clone or download the repository and import the project to the IDE of your choice as a Maven project. You need to have 11 installed.
The project consist of four sub-projects:
- main-ui
- greetservice-api
- greetservice-impl
- help-view
The main-ui
project contains the code for Web Application Bundle (WAB) which can be deployed
to any OSGi container. This is also the Karaf feature that gets packaged during the build. The most relevant parts are two views that it contains:
- MainView, which is always available. It uses GreetService, in a Button click listener in case an implementation is available as an OSGi service.
- ServiceDependantView view is only visible in the UI if an implementation of GreetService is available.
The module also provides a simple menu and MainLayout for other bundles that can contribute views to the UI, and Vaadin boiler plate to configure app for PWA features, server push, missing views etc.
The greetservice-api
project provides an API for a dummy service used by the main-ui project.
The greetservice-impl
project provides an implementation for GreetService, that is defined and used by the MainView in the main-ui
project. The main-ui does not depend on this bundle and it is not required to run the project. But deploying it separately affects how the application behaves.
The help-view
is another optional bundle which contains an optional view (and a route target). It can be deployed or un-deployed at any time. The help view will be available in the main-ui
project and its menu only if the help-view
bundle is deployed.
The simplest way to start the project is run command mvn install
to install project artifact and
mvn -pl main-ui install -Prun
to run Karaf OSGi container. After a while, the Vaadin UI will be available in http://localhost:8181. Note that this only deploys the main-ui bundle, and not the optional help-view or greetservice-impl bundles.
For more dynamic tutorial we suggest to follow these steps:
- Build the project using
mvn install
- Download Karaf and start it from command line using
./bin/karaf
from the Karaf directory - In the Karaf console, execute
feature:install http war
to install required web capabilities - Next, install the plain main-ui using
feature:repo-add mvn:com.example/main-ui/1.0.0-SNAPSHOT/xml/features
andfeature:install main-ui
. This deploys the main-ui and all required dependencies. - Now you can navigate to http://localhost:8181 to see the basic UI without the other bundles. Try clicking the button as well.
- Next, install the greetservice-impl bundle using
bundle:install mvn:com.example/greetservice-impl/1.0.0-SNAPSHOT
andbundle:start greetservice-impl
- Now you can see that
Optional
view (defined in ServiceDependantView Java class) appeared in the menu. Nothing needs to be done at the browser, because Vaadin takes care of updating the UI using the WebSocket based "server push" connection. Try the button again and you'll see that the click listener now responds differently as an implementation for GreetService is available. - Next, install the optional help view using
bundle:install mvn:com.example/help-view/1.0.0-SNAPSHOT
andbundle:start help-view
- The menu in your browser now has the newly loaded help view in it
See readme files starter/README.md and help-view/README.md in the projects for further details.
Vaadin application generally contains dependencies to other bundles: e.g. Vaadin components like Button
,
TextField
, etc. Every Vaadin component is based on a Web Component which
is represented by frontend resources. All frontend resources are built into a bundle
along with Vaadin WAB. As a result:
- any Vaadin component bundle update is possible only within the same minor version, so that the Web Component version stays the same (and only Java code is updated). We don't recommend updating any version over a minor for Flow or the web component Flow integrations (even though it's not prevented anyhow at the moment).
- Updating any bundle that has frontend resources requires that the frontend build goal
build-frontend
is run and the WAB is redeployed to get the static frontend bundle updated.
Here is a list of things which are not currently supported:
- NPM dev mode: it's possible to run Vaadin web application in both production and dev mode, but dev mode can be used only with precompiled frontend resources (via vaadin-maven-plugin) and it's not possible to use a dev server (Webpack) within OSGi.
- it's not possible to use OSGi declarative services with Vaadin components using injection: you may not inject a service declaratively in Vaadin classes (using annotations) just because UI objects are not managed by OSGi. But you still may call OSGi services programmatically of course.
- There is no automatic servlet registration. So the web application bundle should register the servlet itself.
- Server push may have issues with certain HTTP Whiteboard implementations.
- Sometimes after the
Artifact deployed
message appears in the terminal, requestinghttp://localhost:8181
would result in a 404 error. There can be two cases when this happens:- After a cold start (clean install) since the karaf runtime is being downloaded, extracted and at least 180-190 bundles are being cached (depending on the features installed) it would take some seconds for the application to be reachable, so wait a while and refresh the page to see the application up and running. This is almost not happening when you are not cleaning the target folder and the application is just being run from an existing artifact and cached karaf runtime.
- Statistically speaking, almost 1 out of 10 times when the application starts (cold or hot), for some currently unknown problem the application would respond with 404 error all the time, and waiting would not alleviate the situation.
Looking at the logs in
main-ui/target/karaf/data/log/karaf.log
, it seems that multiple port binding exceptions are reported all the times (even while the application is responding normally) which might be related to 404 errors, but currently there is no fix or workaround available for this. See #100