Tutorial: Re-package Mule ESB as a standalone client
Case
You have to deliver Mule 2.2.1 as a standalone application, or, more accurately, as a simple archive ready-to-use by someone else (customer, co-team worker, etc.).
In this tutorial, we assume that:
- you have to include external jars, eg. MQ and WebLogic jars
- you have written your XML configuration file for Mule, of which all properties are externalized in an external property file. We don’t mind the actual workflow, we assume you’re skilled enough with Mule 😉
Build
Prerequisites
Prior to building standalone:
- get Mule ESB 2.2.1 standalone archive, available on MuleSoft website
- get the JARs needed by MQ
providerutil.jar
fscontext.jar
dhbcore.jar
connector.jar
commonservices.jar
com.ibm.mqjms.jar
com.ibm.mq.jar
- get WebLogic’s
wlfullclient.jar
- install the zip and the jars on your local repository:
mvn install:install-file -DgroupId=org.mulesource -DartifactId=mule-esb -Dversion=2.2.1 -Dpackaging=zip -Dfile=mule-standalone-2.2.1.zip mvn install:install-file -Dfile=wlfullclient.jar -DgroupId=weblogic -DartifactId=wlfullclient -Dversion=10.3 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -Dfile=fscontext.jar -DgroupId=fscontext -DartifactId=fscontext -Dversion=1.2 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -Dfile=providerutil.jar -DgroupId=fscontext -DartifactId=providerutil -Dversion=1.2 -Dpackaging=jar -DgeneratePom=true mvn install:install-file -DgroupId=mq -DartifactId=com.ibm.mq -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=com.ibm.mq.jar mvn install:install-file -DgroupId=mq -DartifactId=com.ibm.mqjms -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=com.ibm.mqjms.jar mvn install:install-file -DgroupId=mq -DartifactId=dhbcore -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=dhbcore.jar mvn install:install-file -DgroupId=mq -DartifactId=commonservices -Dversion=6.0.2.0 -Dpackaging=jar -Dfile=commonservices.jar mvn install:install-file -DgroupId=connector -DartifactId=connector -Dversion=1.0 -Dpackaging=jar -Dfile=connector.jar
Files to be edited
- Create a
mule-jonathan.xml
file insrc/main/resources/
folder. - Externalize all properties in
mule-jonathan.properties
file insrc/main/resources/
folder. As you may anticipate it, you will have add this property file in Mule classpath - To perform that:
- Copy the wrapper.conf of Mule standalone archive as
src/main/resources/wrapper.conf
- After the line:[java]wrapper.java.classpath.3=%MULE_HOME%/lib/boot/*.jar[/java]
, add the line:
[java]wrapper.java.classpath.4=%MULE_HOME%/etc[/java]
- Copy the wrapper.conf of Mule standalone archive as
- in
src/main/resources/
, create a filestart-mule-jonathan.bat
, with the content:[java]
set MULE_HOME=%CD%
cd %MULE_HOME%\bin
mule.bat -config mule-jonathan.xml
[/java]
Maven
Here is the pom.xml of our project:
[xml]
<?xml version="1.0"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>lalou-jonathan</groupId>
<artifactId>jonathan-parent</artifactId>
<version>1.0</version></parent>
<modelVersion>4.0.0</modelVersion>
<groupId>lalou.jonathan</groupId>
<artifactId>jonathan-lalou-standalone-esb</artifactId>
<packaging>jar</packaging>
<version>${jonathan.version}</version>
<name>jonathan-lalou-standalone-esb</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>org.mulesource</groupId>
<artifactId>mule-esb</artifactId>
<version>2.2.1</version>
<type>zip</type></dependency>
<dependency>
<groupId>weblogic</groupId>
<artifactId>wlfullclient</artifactId>
<version>10.3</version></dependency>
<dependency>
<groupId>fscontext</groupId>
<artifactId>fscontext</artifactId>
<version>1.2</version></dependency>
<dependency>
<groupId>fscontext</groupId>
<artifactId>providerutil</artifactId>
<version>1.2</version></dependency>
<dependency>
<groupId>mq</groupId>
<artifactId>com.ibm.mq</artifactId>
<version>6.0.2.0</version></dependency>
<dependency>
<groupId>mq</groupId>
<artifactId>com.ibm.mqjms</artifactId>
<version>6.0.2.0</version></dependency>
<dependency>
<groupId>mq</groupId>
<artifactId>commonservices</artifactId>
<version>6.0.2.0</version></dependency>
<dependency>
<groupId>mq</groupId>
<artifactId>dhbcore</artifactId>
<version>6.0.2.0</version></dependency>
<dependency>
<groupId>connector</groupId>
<artifactId>connector</artifactId>
<version>1.0</version></dependency></dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>**/*</exclude></excludes></resource></resources>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2-beta-2</version>
<configuration>
<descriptors>
<descriptor>src/main/assembly/assembly.xml</descriptor></descriptors></configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
[/xml]
Maven Assembly
We will use Maven Assembly: this plugin allows unpack archives, copy files, insert files, delete folders, etc.
Here is the assembly.xml file that should be located in src/main/assembly/
folder of your project. The code is commented so that you understand what we do.
[xml]
<assembly xmlns="http://maven.apache.org/xsd/1.1.0/assembly" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/xsd/assembly-1.1.2.xsd http://maven.apache.org/xsd/1.1.2/assembly">
<id/>
<baseDirectory>jonathan-lalou-standalone-esb-${version}</baseDirectory>
<formats>
<format>zip</format></formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<includes>
<include>org.mulesource:mule-esb</include></includes>
<unpack>true</unpack>
<unpackOptions>
<excludes>
<!– excluse original wrapper.conf, to include our tuned wrapper.conf–>
<exclude>**/conf/wrapper.conf</exclude>
<!–remove the these folders, useless in a standalone client–>
<exclude>**/examples/**</exclude>
<exclude>**/docs/**</exclude>
<exclude>**/src/**</exclude></excludes></unpackOptions></dependencySet>
<dependencySet>
<outputDirectory>mule-standalone-2.2.1/lib/user</outputDirectory>
<excludes>
<exclude>org.mulesource:mule-esb</exclude></excludes></dependencySet></dependencySets>
<fileSets>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>/mule-standalone-2.2.1/etc</outputDirectory>
<includes>
<!–include the property file –>
<include>**/*jonathan*.properties</include></includes></fileSet>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>/mule-standalone-2.2.1/bin</outputDirectory>
<includes>
<!– include Mule XML config file–>
<include>**/*jonathan*.xml</include></includes></fileSet>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>/mule-standalone-2.2.1/conf</outputDirectory>
<includes>
<!– modified wrapper.conf to stake in account the etc/ folder, containing the property file–>
<include>**/wrapper.conf</include></includes></fileSet>
<fileSet>
<directory>${basedir}/src/main/resources</directory>
<outputDirectory>/mule-standalone-2.2.1/</outputDirectory>
<includes>
<include>**/*-mule-jonathan.bat</include>
</includes>
</fileSet>
</fileSets>
</assembly>
[/xml]
Build process
To build go to the folder yourproject/jonathan
, then launch a mvn clean install
. A complete installation package is output on target
folder: jonathan-lalou-standalone-esb-1.0.zip
.
The archive is built thanks to Maven Assembly plugin.
Install
Install
Copy or move the archive jonathan-lalou-standalone-esb-1.0.zip
to any folder of your choice. Then unzip it.
(optionnal) Checks
Tree
Here is a tree of the installation, with some important file that must appear:
+---start-mule-jonathan.bat +---bin ¦ +---mule-jonathan.xml +---conf ¦ +---wrapper.conf +---etc ¦ +---mule-jonathan.properties +---lib ¦ +---boot ¦ ¦ +---exec ¦ +---endorsed ¦ +---mule ¦ +---opt ¦ +---user ¦ +------com.ibm.mq-6.0.2.0.jar ¦ +------com.ibm.mqjms-6.0.2.0.jar ¦ +------commonservices-6.0.2.0.jar ¦ +------connector-1.0.jar ¦ +------dhbcore-6.0.2.0.jar ¦ +------fscontext-1.2.jar ¦ +------providerutil-1.2.jar ¦ +------wlfullclient-10.3.jar ¦ +------connector-1.0.jar +---licenses +---logs
Files
Check the files listed above in the tree appear. Besides, check the conf/wrapper.conf
file contains the line wrapper.java.classpath.4=%MULE_HOME%/etc
Config
Edit etc/mule-jonathan.properties
file and set the right properties.
Use
Execute start-mule-jonathan.bat
to launch Mule on Windows. On first attempt, Mule will display the user licence and ask you your confirmation you accept the terms of the agreement.
Hi Buddie,
Gratitude for putting up this prolific article! You truly make everything a cake walk. Genuinely good stuff, saving time and energy.
MuleSoft – I know most of you might already know about and its greatest features it offers. Like everyone I have a curios side to find out how things works with MuleSoft, how Integration’s are implemented, how do I learn and how different are they from other platforms. Well, I guess everyone have to go through that phase of exploration.
I had great experience with discovery stage and believe it or not, YOU can built your own API like never before.
First few days I kept flipping documents/notes/release notes but was always missing that good easy start scenario, finally CHAMPIONSHIP Program was on my way…..Whola!! Unlike SalesForce’s championship program where the registration process is a hassle and goes through a approval process.
It was cool to see your article pop up in my google search for the process yesterday. Great Guide.
Keep up the good work!
Thanks,
Kumar
Hi Jonathan,
Allow me to show my gratitude bloggers. You guys are like unicorns. Never seen but always spreading magic. Your content is yummy. So satisfied.
What is the difference between web APIs and web services? Let’s start off with an analogy: all tigers are cats but not all cats are tigers. In a similar way, all web services are APIs, but not all APIs are web services. Web APIs and web services are often confused with each other; however, web APIs are an evolution of web services. Both facilitate information transfer, but web APIs are more dynamic than web services are.
Thanks a lot. This was a perfect step-by-step guide. Don’t think it could have been done better.
Kind Regards,
Abhiram