OSGi Web Application
OSGi has support for web applications included for a long time in form of Java Servlet support.
Maven
The maven-bundle-plugin does most of the work for getting the manifest right.
<dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.0.1</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>2.3.5</version> <executions> <execution> <id>bundle-manifest</id> <phase>process-classes</phase> <goals> <goal>manifest</goal> </goals> </execution> </executions> <configuration> <supportedProjectTypes> <supportedProjectType>jar</supportedProjectType> <supportedProjectType>bundle</supportedProjectType> <supportedProjectType>war</supportedProjectType> </supportedProjectTypes> <instructions> <Embed-Directory>WEB-INF/lib</Embed-Directory> <Embed-Dependency>*;scope=compile</Embed-Dependency> <Embed-Transitive>true</Embed-Transitive> </instructions> </configuration> </plugin> <plugin> <!-- Need to use this plugin to build war files --> <artifactId>maven-war-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId> <version>2.4</version> <configuration> <!-- We don't always have a web.xml --> <failOnMissingWebXml>false</failOnMissingWebXml> <archive> <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile> </archive> </configuration> </plugin> </plugins> </build>
The project specific manifest entries are extracted into an extra properties file:
Bundle-ClassPath: .,WEB-INF/classes Web-ContextPath: /application_url_part
It is important to add the root of the WAR file to the bundle classpath.
Servlet
An extremely simple Servlet:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(displayName="RPG Next Gen OSGi Simple Servlet" , value="/*") public class SimpleServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter writer = response.getWriter(); writer.println("Enter the matrix ..."); } }
No web.xml
file is needed for this simple setup.
Apache Karaf
For this example to work in Apache Karaf only the war
feature is needed.
feature:install war