Adding Non-Plugin Modules to Commerce Manager
Adding Non-Plugin Modules to Commerce Manager
If you have created a new Commerce Engine Extension jar module (e.g. ext-settings), or you have introduced a new third-party dependency (e.g. org.apache.commons:commons-text), you will likely need to add this module to the Commerce Manager, particularly if the module is a dependency of ext-core.
Understanding ext-cm-libs
New non-plugin modules can be made available to the Commerce Manager by embedding them within the com.elasticpath.extensions.cm.ext-cm-libs project. ext-cm-libs is a project which bundles together all extension libraries that must be deployed within Commerce Manager via an OSGi manifest. It also acts as a wrapper for libraries that are non-OSGi bundles, making their contents available to the OSGi container.
Adding modules to ext-cm-libs
To add modules to com.elasticpath.extensions.cm.ext-cm-libs, modify the commerce-extensions/cm/ext-cm-libs/pom.xml file and add your module to the <dependencies> section:
<dependencies> <!-- existing dependencies --> <dependency> <groupId>the.group.id</groupId> <artifactId>your-artifact-id-here</artifactId> </dependency> </dependencies>
To ensure that the module is included within the com.elasticpath.extensions.cm.ext-cm-libs bundle, add its artifact ID to the EmbedDependency entry within the maven-bundle-plugin configuration.
<Embed-Dependency>ext-core,ep-your-artifact-id-here</Embed-Dependency>
Exposing non-OSGi Classes to OSGi Bundles
If your module is a non-OSGi module, it's like that it provides classes that need to be accessed by other bundles, perhaps to assign or instantiate a variable, in an instanceof condition, or in a catch block. In this case it must be exported from the com.elasticpath.extensions.cm.ext-cm-libs module.
OSGi bundles only provide access to packages that are explicitly exported - if a class in a non-exported package is attempted to be loaded by another bundle, it will cause a ClassNotFoundException or NoClassDefFoundError.
A key role of the com.elasticpath.extensions.cm.ext-cm-libs project is to allow non-OSGi modules to participate in an OSGi container. Part of its responsibility is to export the required packages on the embedded modules' behalf.
Add the required packages to the maven-bundle-plugin configuration within commerce-extensions/cm/ext-cm-libs/pom.xml:
<_exportcontents> org.some.package.to.export, org.some.other.package.to.export, com.elasticpath.extensions.* </_exportcontents>
The nature of OSGi applications tends to make the previous step iterative; exporting one package reveals another that is also required. Add your dependancy, as well as any other dependancies required.