OSGi is a module system and service platform for the Java programming language. It uses a more modular classloader hierarchy, which requires some additional configuration when using Scalate.
When deploying a WAR file in Karaf using a war:
URL, the bundle automatically gets imports for javax.servlet
and javax.servlet.http
.
In order for Scalate to work properly, a few additional imports are required.
org.osgi.platform
org.osgi.services.packageadmin
javax.swing.tree
When using Apache Karaf (or another environment that uses Pax Logging), you can optionally add:
org.slf4j
to allow Scalate to use the provided logging servicesThe required imports can be added dynamically when installing the WAR file by using these options on the war:
URL:
Import-Package
to specify the required importsWebapp-Context
to specify the web application context rootExample: to install a file name documentation.war on Karaf
osgi:install -s war:file:documentation.war?Webapp-Context=documentation&Import-Package=org.slf4j,javax.servlet,javax.servlet.http,org.osgi.framework,org.osgi.service.packageadmin
Another way to add the required imports, is by including the necessary configuration in your WAR file directly at build time. This can be done with the Maven bundle plugin:
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<archive>
<manifestFile>
${project.build.outputDirectory}/META-INF/MANIFEST.MF
</manifestFile>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<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>
<Import-Package>
javax.servlet,javax.servlet.http,
org.osgi.framework,org.osgi.service.packageadmin,
javax.swing.tree,
org.slf4j
</Import-Package>
<Bundle-ClassPath>.,WEB-INF/classes</Bundle-ClassPath>
<Embed-Directory>WEB-INF/lib</Embed-Directory>
<Embed-Dependency>
*;scope=compile|runtime
</Embed-Dependency>
<Embed-Transitive>true</Embed-Transitive>
<Webapp-Context>documentation</Webapp-Context>
</instructions>
</configuration>
</plugin>