Announcement: You can find the guides for Commerce 7.5 and later on the new Elastic Path Documentation site. The Developer Center continues to support Commerce 6.13.0 through 7.4.1.Visit new site

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.