Have you implemented OpenMRS? Please participate in the Implementation Site Survey. If you already have, thank you!
Page tree
Skip to end of metadata
Go to start of metadata

Requiring modules:

A module can only access the api/service of another module if it is marked as required.  The classloaders restrict this.  The reasoning is both make classloading faster and to prevent classloading errors if the other module does not exist in a running openmrs.

To denote that the module you are writing depends on, or requires another one, put something like the following in your config.xml file:

<require_modules>
       <require_module version="1.8">org.openmrs.module.formentry</require_module>
</require_modules>

  • The "version" attribute on the require_module element is available as of OpenMRS v1.5.
  • You probably want to then take the other module's .omod file, put it in your module's lib-common folder, and add it as a library in your eclipse project's build path(Add it to the .classpath of your module and also add to your build.xml <include name="*/.omod"/> to the <fileset dir="lib-common"> tab and ant should be able to see it too.
  • The "require_modules" element must be after "require_version" and before "extension" in the config.xml file

With this example, if at least formentry version 1.8 is not installed, then this module will not start. 

Being aware of other modules:

This feature is available starting from OpenMRS v1.9

There are times when you need to be able to make a module aware of other modules, without requiring them.  This means that if the other module is also installed, do some extra features.

A specific example: The dev of formimportexport module wants his module to be able to be installed without requiring the user to install the formentry module as well. However, formimportexport has some extra stuff to do to forms if formentry is installed, so it needs to call formentry's API optionally.

Formimportexport should be aware of formentry, be compiled against formentry.jar, and be able to say something like:

if (ModuleFactory.isModuleStarted("formentry"))
       rebuildXsn();

To denote that the module you are writing is aware of another one, put something like the following in your config.xml file:

<aware_of_modules>
       <aware_of_module version="1.8">org.openmrs.module.formentry</aware_of_module>
</aware_of_modules>

Compiling against the module

If you have a mavenized module:

  1. In your module's root pom.xml you need something like this:
    <dependencyManagement>
    	<dependencies>
    		<!-- Depends on ZZZ module -->
    		<dependency>
    			<groupId>org.openmrs.module</groupId>
    			<artifactId>themoduleid-api</artifactId>
    			<version>1.0</version>
    			<type>jar</type>
    			<scope>provided</scope>
    		</dependency>
    		...
    	</dependencies>
    </dependencyManagement>
    
  2. In your module's omod/pom.xml you need something like this:
    <dependency>
    	<groupId>org.openmrs.module</groupId>
    	<artifactId>themoduleid-api</artifactId>
    </dependency>
    

If your module is NOT using maven:

  • Take the other module's .jar or .omod file, put it in your module's lib-common folder, and add it as a library in your eclipse project's build path.

Notes:

  • The "aware_of_modules" element must be between "require_version" and "extension" in the config.xml file
  • No labels

1 Comment

  1. Seeing as the modues use a maven archetype for a module, why not list a dependency to the published api and omod from the maven repository?

    Eg. pom.xml to include the Metadata Sharing Module:

    pom.xml
    <dependency>
    			<groupId>org.openmrs.module</groupId>
    			<artifactId>metadatasharing-api</artifactId>
    			<version>1.0.9</version>
    		</dependency>