You can create applications for Liferay DXP as Java EE-style Web Application
ARchive (WAR) artifacts or as Java ARchive (JAR) OSGi bundle artifacts. Bean
Portlets, PortletMVC4Spring Portlets, and JSF Portlets must be packaged as WAR
artifacts because their frameworks are designed for Java EE. Therefore, they
expect a WAR layout and require Java EE resources such as the
Liferay provides a way for these WAR-styled plugins to be deployed and treated like OSGi modules by Liferay’s OSGi runtime. They can be converted to WABs.
Liferay DXP supports the OSGi Web Application Bundle (WAB) standard for deployment
of Java EE style WARs. Simply put, a WAB is an archive that has a WAR layout and
META-INF/MANIFEST.MF file with the
directive. A WAB is an OSGi bundle. Although the project source has a WAR
layout, the artifact filename may end with either the
Liferay only supports the use of WABs that have been auto-generated by the WAB Generator. The WAB Generator transforms a traditional WAR-style plugin into a WAB during deployment. So what exactly does the WAB Generator do to a WAR file to transform it into a WAB?
The WAB Generator detects packages referenced in the plugin WAR’s JSPs,
descriptor files, and classes (in
WEB-INF/classes and embedded JARs). The
descriptor files include
liferay-hook.xml. The WAB Generator verifies
whether the detected packages are in the plugin’s
WEB-INF/classes folder or in
an embedded JAR in the
WEB-INF/lib folder. Packages that aren’t found in
either location are added to an
Import-Package OSGi header in the WAB’s
To import a package that is only referenced in the following types of locations,
you must add an
Import-Package OSGi header to the plugin’s
WEB-INF/liferay-plugin-package.properties file and add the package to that
header’s list of values.
- Unrecognized descriptor file
- Custom or unrecognized descriptor element or attribute
- Reflection code
- Class loader code
The WAB folder structure and WAR folder structure differ. Consider the following folder structure of a WAR-style portlet.
When a WAR-style portlet is deployed to Liferay DXP and processed by the WAB Generator, the portlet’s folder structure is transformed.
The major difference is the addition of the
META-INF/MANIFEST.MF file. The WAB
Generator automatically generates an OSGi-ready manifest file. If you want to
affect the content of the manifest file, you can place bnd directives and OSGi
headers directly into your plugin’s
To deploy a WAB based on your WAR plugin, copy your WAR plugin to your Liferay DXP
deploy/ folder in your
Optionally, save the WAB to a local folder. This gives you the opportunity to
inspect the generated WAB. To store generated WABs, add the following portal
properties to a
[Liferay Home]/portal-ext.properties file. Then restart
These properties instruct the WAB generator to store generated WABs in your
osgi/wabs/ folder. The generated WABs have the same
structure as the example WAB structure listed above. The
Module Framework Web Application Bundles
properties section explains more details.
Awesome! You have deployed your WAR plugin as a WAB and you know how to save a copy of the WAB to examine it!