Creating a Hello World JBI
...
Service Engine
This tutorial describes how to create a very simple Hello World style of JBI componentservice engine. This tutorial is as minimalistic as possible so as to focus on key concepts and not drown in details. The Hello World component will respond to all requests with the message:
...
The following sections will walk through the creation, packaging, testing and deployment of the Hello World componentservice engine.
Prerequisites
- Maven 2.0.4 or higher
- If you have never used Maven previously the Maven Getting Started Guide explains some valuable concepts surrounding Maven
- ServiceMix 3.1-incubating-SNAPSHOT or higher
- See the ServiceMix downloads to grab a nightly build as ServiceMix 3.1 has not yet been released
- A broadband internet connection so Maven can automatically download dependencies
...
Now let's move on to creating the Maven projects for the Hello World componentservice engine.
Creating a Maven Project For the JBI
...
SE
The focus of this section is on the creation of a JBI componentservice engine. For this task, a Maven archetype will be used to create a Maven project skeleton to house the component. Maven archetypes are templates for Maven projects that jumpstart project creation via the automation of repetitive tasks by following standard conventions. The result of using an archetype to create a Maven project is a directory structure, a Maven POM file and, depending on the archetype being used, sometimes Java objects and JUnit tests.
...
Code Block |
---|
$ mkdir hello-world-smx $ cd hello-world-smx |
2) Use either the servicemix-service-engine or the servicemix-binding-component Maven archetype to generate a Maven project for the component.
...
...
Being that the difference between a BC and a SE is not denoted by the JBI APIs but rather the functionality of the component (see comments above on BCs vs SEs) it is up to you what type of component you create. This tutorial will show the commands for creating both a BC and a SE.
To create a SE, execute the following command on the command-line:
Panel |
---|
$ mvn archetype:create \ |
To create a BC, execute the following command on the command-line:
...
The command above will create a directory named hello-world-se-su
that houses a Maven project for the JBI service engine being created here. The name of the directory is taken from the artifactId
parameter.
The first three parameters to the mvn
command (-
...
DarchetypeGroupId=org.apache.servicemix.tooling
...
-DarchetypeArtifactId=servicemix-
...
The command above will create a directory named hello-world-su
that houses a Maven project for the JBI service engine being created here. The name of the directory is taken from the artifactId
parameter.
The first three parameters to the mvn
command (-DarchetypeGroupId=org.apache.servicemix.tooling -DarchetypeArtifactId=servicemix-service-engine -DarchetypeVersion=3.1-incubating-SNAPSHOT) identify which Maven archetype to use for the archetype:create
goal, while the last two parameters (-DgroupId=org.apache.servicemix.samples.helloworld.se -DartifactId=hello-world-se-su) uniquely identify the Maven project that is being generated. The groupId
is used as the Java package and the artifactId
is used as the project name. Therefore, only alphanumeric characters are valid values for the groupId
and artifactId
parameters.
...
No Format |
---|
[INFO] Scanning for projects... [INFO] Searching repository for plugin with prefix: 'archetype'. [INFO] ---------------------------------------------------------------------------- [INFO] Building Maven Default Project [INFO] task-segment: [archetype:create] (aggregator-style) [INFO] ---------------------------------------------------------------------------- [INFO] Setting property: classpath.resource.loader.class => 'org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader'. [INFO] Setting property: velocimacro.messages.on => 'false'. [INFO] Setting property: resource.loader => 'classpath'. [INFO] Setting property: resource.manager.logwhenfound => 'false'. [INFO] ************************************************************** [INFO] Starting Jakarta Velocity v1.4 [INFO] RuntimeInstance initializing. [INFO] Default Properties File: org/apache/velocity/runtime/defaults/velocity.properties [INFO] Default ResourceManager initializing. (class org.apache.velocity.runtime.resource.ResourceManagerImpl) [INFO] Resource Loader Instantiated: org.codehaus.plexus.velocity.ContextClassLoaderResourceLoader [INFO] ClasspathResourceLoader : initialization starting. [INFO] ClasspathResourceLoader : initialization complete. [INFO] ResourceCache : initialized. (class org.apache.velocity.runtime.resource.ResourceCacheImpl) [INFO] Default ResourceManager initialization complete. [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Literal [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Macro [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Parse [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Include [INFO] Loaded System Directive: org.apache.velocity.runtime.directive.Foreach [INFO] Created: 20 parsers. [INFO] Velocimacro : initialization starting. [INFO] Velocimacro : adding VMs from VM library template : VM_global_library.vm [ERROR] ResourceManager : unable to find resource 'VM_global_library.vm' in any resource loader. [INFO] Velocimacro : error using VM library template VM_global_library.vm : org.apache.velocity.exception.ResourceNotFoundException: Unable to find resource 'VM_global_library.vm' [INFO] Velocimacro : VM library template macro registration complete. [INFO] Velocimacro : allowInline = true : VMs can be defined inline in templates [INFO] Velocimacro : allowInlineToOverride = false : VMs defined inline may NOT replace previous VM definitions [INFO] Velocimacro : allowInlineLocal = false : VMs defined inline will be global in scope if allowed. [INFO] Velocimacro : initialization complete. [INFO] Velocity successfully started. [INFO] [archetype:create] [INFO] Defaulting package to group ID: org.apache.servicemix.samples.helloworld.se [INFO] ---------------------------------------------------------------------------- [INFO] Using following parameters for creating Archetype: servicemix-service-engine:3.1-incubating-SNAPSHOT [INFO] ---------------------------------------------------------------------------- [INFO] Parameter: groupId, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: packageName, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: basedir, Value: /Users/bsnyder/src/hello-world-smx [INFO] Parameter: package, Value: org.apache.servicemix.samples.helloworld.se [INFO] Parameter: version, Value: 1.0-SNAPSHOT [INFO] Parameter: artifactId, Value: hello-world-se-su [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 63,column 16] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 68,column 16] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 83,column 18] : ${servicemix-version} is not a valid reference. [WARNING] org.apache.velocity.runtime.exception.ReferenceException: reference : template = archetype-resources/pom.xml [line 94,column 18] : ${xbean-version} is not a valid reference. [INFO] ********************* End of debug info from resources from generated POM *********************** [INFO] Archetype created in dir: /Users/bsnyder/src/hello-world-smx/hello-world-se-su [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 32 seconds [INFO] Finished at: FriMon Jan 0515 1713:2404:3908 MST 2007 [INFO] Final Memory: 5M4M/9M8M [INFO] ------------------------------------------------------------------------ |
...
Note | |||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| |||||||||||||||
The maven-archetype-plugin 1.0-alpha4 or above is required for this tutorial. When an older version is installed, a build error will occur. The version of this plugin can be checked by verifying the name of the following directories:
In case the only version available of the maven-archetype-plugin is an older one, a minimal
|
...
Since we just created this project, we should first compile it just to make sure nothing is wrong with what the archetype generated. To compile, package and test the project, execute the following command from the command-line:
Code Block |
---|
$ cd ./hello-world-su
$ mvn install
|
This command should produce the following output:
the project, execute the following command from the command-line:
Code Block |
---|
$ cd ./hello-world-se-su
$ mvn install
|
This command should produce the following output:
No Format |
---|
No Format |
[INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [install] [INFO] ---------------------------------------------------------------------------- [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.MyComponent Checking: org.apache.servicemix.samples.helloworld.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld/1.0 for namespace: http://org.apache.servicemix.samples.helloworld/1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/META-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld/1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld/1.0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/hello-world-su.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/hello-world-su.xsd for namespace: http://org.apache.servicemix.samples.helloworld/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/hello-world-su.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 3 source files to /Users/bsnyder/src/hello-world-smx/hello-world-su/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] Compiling 1 source file to /Users/bsnyder/src/hello-world-smx/hello-world-su/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.servicemix.samples.helloworld.MySpringComponentTest <hello>world</hello> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.366 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/hello-world-su-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-su/target/hello-world-su-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-su/target/hello-world-su-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-su/target/hello-world-su-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-su/1.0-SNAPSHOT/hello-world-su-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/hello-world-su.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-su/1.0-SNAPSHOT/hello-world-su-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-su/target/xbean/hello-world-su.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-su/1.0-SNAPSHOT/hello-world-su-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-su/target/hello-world-su-1.0-SNAPSHOT-installer.zip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-su/1.0-SNAPSHOT/hello-world-su-1.0-SNAPSHOT-installer.zip [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 16 seconds [INFO] Finished at: Fri Jan 05 22:52:45 MST 2007 [INFO] Final Memory: 12M/33M [INFO] ------------------------------------------------------------------------ [INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [install] [INFO] ---------------------------------------------------------------------------- [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.se.MyComponent Checking: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se/1.0 for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 3 source files to /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] Compiling 1 source file to /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>world</hello> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 12.366843 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1641 seconds [INFO] Finished at: FriMon Jan 0515 2213:5206:4503 MST 2007 [INFO] Final Memory: 12M/33M26M [INFO] ------------------------------------------------------------------------ |
...
Adding Custom Functionality
Note | ||
---|---|---|
| ||
It is at this stage that you should employ the use of an IDE. An IDE can dramatically reduce the work necessary to import clases, override methods and so much more. Because Maven can generate project files for Eclipse and IntelliJ IDEA, either one can be used. Throughout this tutorial, Eclipse will be used. To generate project files for Eclipse, execute the Maven |
When creating a JBI component, how a message exchange is handled depends on whether a component is a consumer or a provider. Because the Hello World component SE will not be consuming any other service (i.e., sending a message to another service), it is a provider (i.e., it will only be providing its service via a return message). As mentioned above, the ExchangeProcessor.process()
method is of interest because it is where the message exchange is handled, so let's examine this method:
...
The implementation of the method above was provided by the servicemix-service-engine Maven archetype. Because the archetype can be used to create either a consumer or a provider service engine, this the servicemix-service-engine Maven archetype. This method is very generic and contains a conditional block for handling either a consumer or a provider role. But this method will still require us to make the decision of which style of Message Exchange Pattern (MEP) to handle. In the case of the Hello World componentSE, we know that it is a provider so it will need to send a return message. Therefore it will need to handle an In-Out MEP. So instead of having MyEndpoint
extend the very basic Endpoint
class and implement its own process()
method, we're going to extend a different class that is specifically for provider endpoints named
ProviderEndpoint
.
...
Notice the diagram above showing the class hierarchy of Endpoint
. The ProviderEndpoint
supplies some additional conveniences for provider components beyond what the Endpoint
class provides and will make the job of implementing MyEndpoint
as a provider much easier. So let's make some changes to the MyEndpoint
class. First remove the process()
method shown above. Second, change the definition of the MyEndpoint
class from this:
...
By the way, making this change will require the import of the full class (org.apache.servicemix.common.endpoints.ProviderEndpoint
). This class can be found in the servicemix-common project.
Third, because the ProviderEndpoint.process()
method already handles an In-Out MEP (and other MEPs), MyEndpoint
will simply need to override the ProviderEndpoint.processInOut()
method. Below is the content for implementing this method. Copy/paste this method:
...
This method is the logic for the Hello World componentSE. We're not doing anything complex here at all in order to keep this tutorial very simple. Now it's time to test the component.
...
To execute the test, simply run the Maven install
goal from within the hello-world-se-su
directory like so:
Code Block |
---|
$ mvn install |
...
No Format |
---|
[INFO] Scanning for projects... [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [install] [INFO] ---------------------------------------------------------------------------- [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.se.MyComponent Checking: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se/1.0 for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] Nothing to compile - all classes are up to date [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] Nothing to compile - all classes are up to date [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.656487 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 1816 seconds [INFO] Finished at: FriMon Jan 0515 2313:2719:0351 MST 2007 [INFO] Final Memory: 13M/25M24M [INFO] ------------------------------------------------------------------------ |
...
Code Block |
---|
$ pwd /Users/bsnyder/src/hello-world-smx/hello-world-worldse-su $ cd .. $ mvn archetype:create \ -DarchetypeGroupId=org.apache.servicemix.tooling \ -DarchetypeArtifactId=servicemix-service-assembly \ -DarchetypeVersion=3.1-incubating-SNAPSHOT \ -DgroupId=org.apache.servicemix.samples.helloworld \ -DartifactId=hello-world-sa |
...
Code Block |
---|
$ ls
hello-world-sa hello-world-se-su
|
If you see the above directories, proceed to the next step below. If instead you see the BUILD FAILED output, you'll need to analyze the rest of the output to troubleshoot the issue. Assistance with any issue you might experience is available from the ServiceMix community via the ServiceMix mailing lists archive.
Now that we have a project for the SA, we need to edit the POM so that the project depends upon the JBI component we created above. This can be done by editing the POM for the SA to add a dependency upon the hello-world-se-su
as listed below:
Code Block |
---|
<dependency> <groupId>org.apache.servicemix.samples.helloworld.helloworld<se</groupId> <artifactId>hello-world-se-su</artifactId> <version>1.0-SNAPSHOT</version> </dependency> |
...
Now that we have created the SU and SA projects, a top level pom.xml
must be manually created and made aware of each subproject. This will allow all the projects to be built automatically without having to build each project in order manually. Maven will discover all the projects and build them in the proper order. In the hello-world-se-su
directory, create a file named pom.xml
containing the following content:
Code Block |
---|
<?xml version="1.0" encoding="UTF-8"?>
<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">
<modelVersion>4.0.0</modelVersion>
<groupId>org.apache.servicemix.samples.helloworld</groupId>
<artifactId>hello-world-smx</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<name>Hello World JBI Component</name>
<modules>
<module>hello-world-sa</module>
<module>hello-world-se-su</module>
</modules>
</project>
|
This POM will allow the example to be easily folded in to the ServiceMix samples. The <modules>
element denotes the other projects that were created above using the Maven archetypes. Once the pom.xml
file from above is saved into the hello-world-smx
directory, you should now see the following:
Code Block |
---|
$ ls
hello-world-sa hello-world-se-su pom.xml
|
All projects can now be built using the following command on the command-line from the top level hello-world-smx
directory:
Code Block |
---|
$ mvn clean install |
...
No Format |
---|
[INFO] Scanning for projects... [INFO] Reactor build order: [INFO] A custom project [INFO] A custom project [INFO] Hello World JBI Component [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/test-classes [INFO] [xbean:mapping {execution: default}] Checking: org.apache.servicemix.samples.helloworld.se.MyComponent Checking: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] Generating META-INF properties file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/services/org/apache/xbean/spring/http/ org.apache.servicemix.samples.helloworld.se/1.0 for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 handler mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.handlers for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating Spring 2.0 schema mapping: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/META-INF/spring.schemas for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating HTML documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating XSD file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 [INFO] Generating WIKI documentation file: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.wiki for namespace: http://org.apache.servicemix.samples.helloworld.se/1.0 Warning, could not load class: org.apache.servicemix.samples.helloworld.se.MyEndpoint [INFO] ...done. Downloading: http://repo.mergere.com/maven2/xml-security/xmlsec/1.3.0/xmlsec-1.3.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) Downloading: http://repo.mergere.com/maven2/wss4j/wss4j/1.5.0/wss4j-1.5.0.pom [WARNING] Unable to get resource from repository central (http://repo1.maven.org/maven2) [INFO] [jbi:generate-jbi-component-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] Compiling 3 source files to /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/classes [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] Compiling 1 source file to /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/test-classes [INFO] [surefire:test] [INFO] Surefire report directory: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/surefire-reports ------------------------------------------------------- T E S T S ------------------------------------------------------- Running org.apache.servicemix.samples.helloworld.se.MySpringComponentTest <hello>Hello World! Message [<hello>Ski Colorado!</hello>] contains [28] bytes</hello>. Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 91.47464 sec Results : Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] [jbi:jbi-component] [INFO] Generating installer /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.jar [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT.xsd [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/xbean/hello-world-se-su.xsd.html to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-schema.html [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-se-su/target/hello-world-se-su-1.0-SNAPSHOT-installer.zip to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/se/hello-world-se-su/1.0-SNAPSHOT/hello-world-se-su-1.0-SNAPSHOT-installer.zip [INFO] ---------------------------------------------------------------------------- [INFO] Building A custom project [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-sa/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/test-classes [WARNING] Artifact junit:junit:jar:3.8.1:test retains local scope 'test' overriding broader scope 'compile' given by a dependency. If this is not intended, modify or remove the local scope. [INFO] [jbi:generate-jbi-service-assembly-descriptor] [INFO] Generating jbi.xml [INFO] [resources:resources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:compile] [INFO] No sources to compile [INFO] [resources:testResources] [INFO] Using default encoding to copy filtered resources. [INFO] [compiler:testCompile] [INFO] No sources to compile [INFO] [surefire:test] [INFO] No tests to run. [INFO] [jbi:jbi-service-assembly] [INFO] [jar:jar] [INFO] Building jar: /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/hello-world-sa-1.0-SNAPSHOT.jar [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/hello-world-sa/target/hello-world-sa-1.0-SNAPSHOT.jar to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-sa/1.0-SNAPSHOT/hello-world-sa-1.0-SNAPSHOT.zip [INFO] ---------------------------------------------------------------------------- [INFO] Building Hello World JBI Component [INFO] task-segment: [clean, install] [INFO] ---------------------------------------------------------------------------- [INFO] [clean:clean] [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target/classes [INFO] Deleting directory /Users/bsnyder/src/hello-world-smx/target/test-classes [INFO] [site:attach-descriptor] [INFO] [install:install] [INFO] Installing /Users/bsnyder/src/hello-world-smx/pom.xml to /Users/bsnyder/.m2/repository/org/apache/servicemix/samples/helloworld/hello-world-smx/1.0-SNAPSHOT/hello-world-smx-1.0-SNAPSHOT.pom [INFO] [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] ------------------------------------------------------------------------ [INFO] A custom project ...................................... SUCCESS [3017.738s091s] [INFO] A custom project ...................................... SUCCESS [32.080s465s] [INFO] Hello World JBI Component ............................. SUCCESS [1.547s552s] [INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESSFUL [INFO] ------------------------------------------------------------------------ [INFO] Total time: 3622 seconds [INFO] Finished at: SatMon Jan 0615 1613:30:59:57 MST 2007 [INFO] Final Memory: 15M14M/28M [INFO] ------------------------------------------------------------------------ |
...
- Edit
hello-world-sa/pom.xml
and replace<name>A custom project</name>
with<name>Hello World Service Assembly</name>
- Edit
hello-world-se-su/pom.xml
and replace<name>A custom project</name>
with<name>Hello World SE Service Unit</name>
Now when the projects are built you will no longer see a project named A custom project. Instead you'll now see Hello World SE Service Unit and Hello World Service Assembly. Rebuild the projects again using the mvn clean install
command on the command-line to see the change.
...