Implementing SOA using Opensource Apache Camel JMS Component on WebLogic 12c

Hi,

In one of our previous example we have talked about how we can use “Apache Camel based EJB Client accessing the EJBs deployed on WebLogic 12c”, Now we will see how we can develop a simple Web Application using Apache Camel Servlet which will accept inputs form the user and then will process those inputs (like adding the input numbers) and then the generated HTMPL output will be send to the WebLogic JMS Queue.

As part of this example we are going to use the “org.apache.camel.component.jms.JmsComponent” and Apache Camel “servlet:” endpoint. The Camel JMS component is a general purpose JMS integration point that can be used to integrate Apache Camel with any JMS client library. Using the Camel JMS component, it is possible to define JMS consumer endpoints (at the start of a Camel route) and JMS producer endpoints (at the end of a Camel route). Similarly The servlet: component provides HTTP based endpoints for consuming HTTP requests that arrive at a HTTP endpoint that is bound to a published Servlet.

For more information on Camel JMS Endpoint can be found at : http://camel.apache.org/jms.html . This component allows messages to be sent to (or consumed from) a JMS Queue or Topic. It uses Spring’s JMS support for declarative transactions, including Spring’s JmsTemplate for sending and a MessageListenerContainer for consuming.

Apache Camel’s API and out-of-the-box components implement many common enterprise integration patterns (EIPs), making it relatively simple and easy to do integration tasks such as connecting web services, performing XSL transformations, logging audits, and more. Camel supports most of the Enterprise Integration Patterns. See: http://camel.apache.org/enterprise-integration-patterns.html

What this demo is about ?

As part of this demo we will see how to use Apache Camel based WAR on latest WebLogic 12.2.1 (12c). While running this demo we will learn about the following things:

1. How to develop a Apache Camel based Camel Servlet to accept http request param inputs and to process them.

2. How to use the Apache Camel JMS Component to send the JMS Message (processed data) to the WebLogic Queue.

3. How to deploy the Camel based WebApplication on WebLogic using WebLogic 12.2.1 using maven plugin “weblogic-maven-plugin”. If you get any kind of error while using this plugin then refer to the article How to use WebLogic 12c provided Maven Synchronization Plug-In ?

4. Configuring JMS Connection Factory and the JMS Queues using WLST.

5. We are going to use Apache Camel 2.16.0, Spring 4.1.6.RELEASE and WebLogic 12.2.1 release for this demo.

Configuring JMS Queue and ConnectionFactory

Step-1). First create a directory some where in our filesystem where we will be keeping our projects. We will create a directory as “CamelServlet_With_JMSEndpoint_Demo”

 $ mkdir -p Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo

 $ mkdir -p Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/src/main/java/beans

 $ mkdir -p Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/src/main/resources

 $ mkdir -p Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/src/main/webapp/WEB-INF

Step-2). Lets write the “Camel-on-WebLogic12c/domains.properties” file where we will define all the properties which will be used by the WLST script to configure the JMS Queue and ConnectionFactory.

############ WebLogic 12c JMS Queue and Connection Factory related Configuration #########

# 1 - Connecting details
server.url = t3://localhost:7001
username = weblogic
password = weblogic1
 
# 2 - JMSServer details
jms.server.name = My_JMSServer
store.name = MyJDBCStore
tragated.jms.server.name = AdminServer
 
# 3 - SystemModule Details
system.module.name = My_SystemModule
tragated.system.module.name = AdminServer
 
# 4 - ConnectionFactory Details
connection.factory.name = My_ConnectionFactory
connection.factory.jndi.name = My_CF
 
# 5 - Unit Of Order Details
unit.of.order.value = 1
 
# 6 - SubDeployment & Queue Details
queue.sub.deployment.name = Sub_My_Queue
queue.name = My_Queue
queue.jndi.name = My_Q

Step-3). Now we will write a simple WLST Script which will use the above properties file and configure the JMS resources on WebLogic. Create a file as “Camel-on-WebLogic12c/configureJMS.py”

#############################################################################
#
# @author Copyright (c) 2010 - 2011 by Middleware Magic, All Rights Reserved.
#
#############################################################################
 
from java.io import FileInputStream
import java.lang
import os
import string
 
propInputStream = FileInputStream("domain.properties")
configProps = Properties()
configProps.load(propInputStream)
 
# 1 - Connecting details
serverUrl = configProps.get("server.url")
Username = configProps.get("username")
Password = configProps.get("password")
 
# 2 - JMSServer details
jmsServerName = configProps.get("jms.server.name")
storeName = configProps.get("store.name")
tragatedJMSServerName = configProps.get("tragated.jms.server.name")
 
# 3 - SystemModule Details
systemModuleName = configProps.get("system.module.name")
tragatedSystemModuleName = configProps.get("tragated.system.module.name")
 
# 4 - ConnectionFactory Details
connectionFactoryName = configProps.get("connection.factory.name")
ConnectionFactoryJNDIName = configProps.get("connection.factory.jndi.name")
 
# 5 - Unit Of Order Details
unitOfOrderValue = configProps.get("unit.of.order.value")
 
# 6 - SubDeployment & Queue Details
queueSubDeploymentName = configProps.get("queue.sub.deployment.name")
queueName = configProps.get("queue.name")
queueJNDIName = configProps.get("queue.jndi.name")
 
#7 - Weblogic Bridge Details:
weblogicDestinationBridge = configProps.get("weblogic.destination.bridge")
weblogicAdapterJNDINoTX = configProps.get("weblogic.adapter.jndi.name")

#8 - Widlfly bridge details:
wildflyDestinationBridge = configProps.get("wildfly.destination.bridge")
wildflyServerUrl = configProps.get("wildfly.server.url")
wildflyJMSUsername = configProps.get("wildfly.jms.username")
wildflyJMSUserPassword = configProps.get("wildfly.jms.password")
wildflyInitialContextFactory = configProps.get("wildfly.initial.context.factory")
wildflyJMSConnectionFactory = configProps.get("wildfly.remote.connection.factory.jndi.name")
wildflyJMSQueueJndi = configProps.get("wildfly.jms.destination.jndi.name")




redirect('wlst.log','false')
 
# 1 - Connecting to the Destination 
connect(Username,Password,serverUrl)
 
edit()
 
# 2 - JMSServer details
print "================== JMSSever ==================="
startEdit()
cmo.createJMSServer(jmsServerName)
print "Created a JMSServer !!"
cd('/Deployments/'+jmsServerName)
cmo.setPersistentStore(getMBean('/FileStores/'+storeName))
print "PersistentStore has been set for the JMSServer !!"
set('Targets',jarray.array([ObjectName('com.bea:Name='+tragatedJMSServerName+',Type=Server')], ObjectName))
print "Targeted the JMSServer !!"
activate()
print ""
 
# 3 - SystemModule Details
print "================== SystemModule ==================="
startEdit()
cd('/')
cmo.createJMSSystemResource(systemModuleName)
print "Created a SystemModule !!"
cd('/SystemResources/'+systemModuleName)
set('Targets',jarray.array([ObjectName('com.bea:Name='+tragatedSystemModuleName+',Type=Server')], ObjectName))
print "Targeted the SystemModule !!"
activate()
print ""
 
# 4 - ConnectionFactory Details
print "================== ConnectionFactory ==================="
startEdit()
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName)
cmo.createConnectionFactory(connectionFactoryName)
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName+'/ConnectionFactories/'+connectionFactoryName)
cmo.setJNDIName(ConnectionFactoryJNDIName)
print "Created a ConnectionFactory !!"
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName+'/ConnectionFactories/'+connectionFactoryName+'/SecurityParams/'+connectionFactoryName)
cmo.setAttachJMSXUserId(false)
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName+'/ConnectionFactories/'+connectionFactoryName)
cmo.setDefaultTargetingEnabled(true)
print "Targeted the ConnectionFactory !!"
activate()
print ""
 
# 5 - SubDeployment & Queue Details
print "================== SubDeployment & Queue ==================="
startEdit()
cd('/SystemResources/'+systemModuleName)
cmo.createSubDeployment(queueSubDeploymentName)
print "Created a SubDeployment for Queue !!"
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName)
cmo.createQueue(queueName)
print "Created a Queue !!"
cd('/JMSSystemResources/'+systemModuleName+'/JMSResource/'+systemModuleName+'/Queues/'+queueName)
cmo.setJNDIName(queueJNDIName)
cmo.setSubDeploymentName(queueSubDeploymentName)
cd('/SystemResources/'+systemModuleName+'/SubDeployments/'+queueSubDeploymentName)
set('Targets',jarray.array([ObjectName('com.bea:Name='+jmsServerName+',Type=JMSServer')], ObjectName))
print "Targeted the Queue to the created subdeployment !!"
activate()
print ""

cmd = "rm -f wlst.log"
os.system(cmd)

Step-4). Now we will start the WebLogic 12.2.1 instance and then we will open a terminal to run the above mentioned WLST script. We will run the “setWLSEnv.sh” script in the terminal first so that it will set the CLASSPATH properly with the required JARs.

$ cd /Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/server/bin

$ . ./setWLSEnv.sh 

CLASSPATH=/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/lib/tools.jar:/Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/modules/features/wlst.wls.classpath.jar:
PATH=/Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/server/bin:/Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/../oracle_common/modules/org.apache.ant_1.9.2/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/jre/bin:/Library/Java/JavaVirtualMachines/jdk1.8.0_60.jdk/Contents/Home/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/../oracle_common/modules/org.apache.maven_3.2.5/bin
Your environment has been set.

Step-5). Running the WLST script in the same terminal.

######  Running the WLST commands as following: #######

$ cd /PATH/TO/Camel-on-WebLogic12c

$ java weblogic.WLST configureJMS.py 

Initializing WebLogic Scripting Tool (WLST) ...
Welcome to WebLogic Server Administration Scripting Shell
Type help() for help on available commands

================== JMSSever ===================
Created a JMSServer !!
PersistentStore has been set for the JMSServer !!
Targeted the JMSServer !!

================== SystemModule ===================
Created a SystemModule !!
Targeted the SystemModule !!

================== ConnectionFactory ===================
Created a ConnectionFactory !!
Targeted the ConnectionFactory !!

================== SubDeployment & Queue ===================
Created a SubDeployment for Queue !!
Created a Queue !!
Targeted the Queue to the created subdeployment !!

Developing the Camel Based WebApp

Step-6). First of all we will write a Simple Bean which will include out business logic of adding two numbers and produce an HTML output containing the sum. For this we will write “MathBean.java” inside the “CamelServlet_With_JMSEndpoint_Demo/src/main/java/beans” as following:

package beans;

public class MathBean {
     private String firstNo="1000";
     private String secondNo="2000";

	public String getFirstNo() {
		return firstNo;
	}

	public void setFirstNo(String firstNo) {
		this.firstNo = firstNo;
	}

	public String getSecondNo() {
		return secondNo;
	}

	public void setSecondNo(String secondNo) {
		this.secondNo = secondNo;
	}
 
    public String addTwoNumbers(String firstNo, String secondNo) {
        System.out.println("[MathBean] addTwoNumbers("+firstNo+","+secondNo+") invoked.");
        int sum = Integer.parseInt(firstNo) + Integer.parseInt(secondNo);
        String result=    "<HTML>" +
                          "   <HEAD><TITLE> Add Numbers Camel Servlet test </TITLE></HEAD>" +
                          "   <BODY>" +
                          "       [MathBean] Sum of " +firstNo+" And "+secondNo+ " is = " + sum + 
                          "   </BODY>" +
                          "</HTML>";
            return result;
        }
}

Step-7). Now we will write a simple “web.xml” file as following which will define the CamelServlet and also declare the Spring “ContextLoaderListener” listener. In the same file we will define the Camel configuration file via “contextConfigLocation” context param. Place the “web.xml” file inside the “CamelServlet_With_JMSEndpoint_Demo/src/main/webapp/WEB-INF/”

<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

  <display-name>Camel Servlet WAR</display-name>
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:camel-config.xml</param-value>
  </context-param>

  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>

  <servlet>
    <servlet-name>CamelServlet</servlet-name>
    <servlet-class>org.apache.camel.component.servlet.CamelHttpTransportServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>CamelServlet</servlet-name>
    <url-pattern>/camel/*</url-pattern>
  </servlet-mapping>

</web-app>

Step-8). Now we will write a simple “index.html” page inside the “CamelServlet_With_JMSEndpoint_Demo/src/main/webapp/”. This Html page will simple provide a form to the user so that they can enter two number which will be later processed bu the camel servlet after submitting the HTML form.

<html>
	<body>
		<h2>MiddlewareMagic: Camel Add Servlet Demo</h2>
		<table>
			<form action="camel/addNumbers">
				<TR><TD>Enter First Number </TD> <TD><input type="text" name="firstNumber" value="200"/></TD></TR>
				<TR><TD>Enter Second Number </TD> <TD> <input type="text" name="secondNumber" value="300"/></TD></TR>
				<TR><TD><input type="reset" value="Clear"/> </TD> <TD> <input type="Submit" value="Add the Numbers and Store result in WebLogic JMS Queue My_Q" /></TD></TR>
			</form>
		</table>
	</body>
</html>

Step-9). Now we will write the Apache Camel context file “camel-config.xml” which defines how the various camel endpoints will work. In order to know more about this please refer to: http://camel.apache.org/configuring-camel.html
Lets create the “camel-config.xml” file inside “CamelServlet_With_JMSEndpoint_Demo/src/main/resources”

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:camel="http://camel.apache.org/schema/spring" xmlns:p="http://www.springframework.org/schema/util" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd">

     <bean id="mathBean" class="beans.MathBean" />

     <camelContext xmlns="http://camel.apache.org/schema/spring">
       <route id="addNumbersRoute">
           <from uri="servlet:///addNumbers"/>
           <transform>
               <method bean="mathBean" method="addTwoNumbers(${header.firstNumber},${header.secondNumber})"/> 
           </transform>
           <inOnly uri="weblogicJMS:My_Q" />
       </route>
     </camelContext>


     <!-- WebLogic JndiTemplate Settings --> 
     <bean id="jmsJndiTemplate" class="org.springframework.jndi.JndiTemplate">
           <property name="environment">
              <props>
                 <prop key="java.naming.factory.initial">weblogic.jndi.WLInitialContextFactory</prop>
                 <prop key="java.naming.provider.url">t3://localhost:7001</prop>
              </props>
           </property>
     </bean>

     <bean id="jndiDestinationResolver" class="org.springframework.jms.support.destination.JndiDestinationResolver">
          <property name="jndiTemplate" ref="jmsJndiTemplate"/>
     </bean>

     <bean id="jmsConnectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean">
          <property name="jndiTemplate" ref="jmsJndiTemplate"/>
          <property name="jndiName" value="My_CF"/>
     </bean>
     
     <bean id="jmsConfiguration" class="org.apache.camel.component.jms.JmsConfiguration">
          <property name="connectionFactory" ref="jmsConnectionFactory"/>
          <property name="destinationResolver" ref="jndiDestinationResolver"/>
     </bean>
          
     <bean id="weblogicJMS" class="org.apache.camel.component.jms.JmsComponent">
          <property name="configuration" ref="jmsConfiguration" />
     </bean>

</beans>

Step-10). Now the most important part in which we will be writing the maven “pom.xml” which will compile and build the above artifacts and will package them as part fo a WAR file. We will be using the “weblogic-maven-plugin” Weblogic plugin in this pom sothat we can easily deploy the WAR to weblogic 12c as well.

<?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/xsd/maven-4.0.0.xsd">

	<modelVersion>4.0.0</modelVersion>
	<groupId>my.camel.servlet.demo</groupId>
	<artifactId>HelloCamelServletWebApp</artifactId>
	<version>1.0</version>
	<packaging>war</packaging>
	<name>HelloCamelServletWebApp Demo</name>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<version.compiler.plugin>2.3.1</version.compiler.plugin>
		<maven.compiler.target>1.7</maven.compiler.target>
		<maven.compiler.source>1.7</maven.compiler.source>
		
		<!-- Camel and Spring related properties -->
		<version.apache.camel>2.16.0</version.apache.camel>
		<version.spring>4.1.6.RELEASE</version.spring>
		
		<!-- Weblogic Plugin related properties -->
		<middleware.home>/Users/jsensharma/NotBackedUp/Installed/wls1221</middleware.home>
        <admin.server.url>t3://localhost:7001</admin.server.url>
        <admin.username>weblogic</admin.username>
        <admin.password>weblogic1</admin.password>
	</properties>

	<dependencies>

		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${version.spring}</version>
		</dependency>

		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-spring</artifactId>
			<version>${version.apache.camel}</version>

			<!-- As we do not want the following JARs inside the "WEB-INF/lib" Hence excluding them : jaxb-api-2.2.7.jar jaxb-core-2.2.7.jar jaxb-impl-2.2.7.jar -->
			<exclusions>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-impl</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.apache.camel</groupId>
			<artifactId>camel-servlet</artifactId>
			<version>${version.apache.camel}</version>
			<!-- As we do not want the following JARs inside the "WEB-INF/lib" Hence excluding them : jaxb-api-2.2.7.jar jaxb-core-2.2.7.jar jaxb-impl-2.2.7.jar -->
			<exclusions>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-impl</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-core</artifactId>
				</exclusion>
			</exclusions>
		</dependency>
        <dependency>
            <groupId>org.apache.camel</groupId>
            <artifactId>camel-jms</artifactId>
            <version>${version.apache.camel}</version>
			<!-- As we do not want the following JARs inside the "WEB-INF/lib" Hence excluding them : jaxb-api-2.2.7.jar jaxb-core-2.2.7.jar jaxb-impl-2.2.7.jar -->
			<exclusions>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-api</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-impl</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.xml.bind</groupId>
					<artifactId>jaxb-core</artifactId>
				</exclusion>
			</exclusions>
        </dependency>
	</dependencies>

	<build>
		<finalName>${project.artifactId}</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>${version.compiler.plugin}</version>
				<configuration>
					<source>${maven.compiler.source}</source>
					<target>${maven.compiler.target}</target>
				</configuration>
			</plugin>
			
			<plugin>
                <groupId>com.oracle.weblogic</groupId> 
                <artifactId>weblogic-maven-plugin</artifactId> 
                <version>12.2.1-0-0</version> 
                <configuration> 
                    <middlewareHome>${middleware.home}</middlewareHome>
                    <adminurl>${admin.server.url}</adminurl>
                    <user>${admin.username}</user>
                    <password>${admin.password}</password>
                    <name>${project.build.finalName}</name>
                    <upload>true</upload> 
                    <action>deploy</action> 
                    <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source>          
                </configuration> 
            </plugin>
		</plugins>
	</build>

</project>

Building and Deploying the Camel WebApp

Now we are going to build and deploy the WebApplication to WebLogic 12.2.1 version. We will use Maven plugins to achieve the same. So before using the maven we need to setup the PATH and M2_HOME as following:

For Unix Based OS

$ export M2_HOME=/PATH/TO/apache_maven_3.2.3
$ export JAVA_HOME=/PATH/TO/jdk1.8.0_60
$ export PATH=$JAVA_HOME/bin:/PATH/TO/apache_maven_3.2.3/bin:$PATH

$ cd /PAYTH/TO/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo
$ mvn clean install weblogic:deploy

For Windows Based OS

$ set M2_HOME=C:\PATH\TO\apache_maven_3.2.3
$ set JAVA_HOME=C:\PATH\TO\jdk1.8.0_60
$ set PATH=%JAVA_HOME%/bin;C:\PATH\TO\apache_maven_3.2.3\bin;%PATH%

$ cd C:\Camel-on-WebLogic12c\CamelServlet_With_JMSEndpoint_Demo
$ mvn clean install  weblogic:deploy

Step-11). Now we are going to build and deploy it on WebLogic as following using mvn clean install weblogic:deploy:


$ cd CamelServlet_With_JMSEndpoint_Demo

$  mvn clean install weblogic:deploy

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building HelloCamelServletWebApp Demo 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ HelloCamelServletWebApp ---
[INFO] Deleting /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target
[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ HelloCamelServletWebApp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.1:compile (default-compile) @ HelloCamelServletWebApp ---
[INFO] Compiling 1 source file to /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ HelloCamelServletWebApp ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.1:testCompile (default-testCompile) @ HelloCamelServletWebApp ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ HelloCamelServletWebApp ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-war-plugin:2.2:war (default-war) @ HelloCamelServletWebApp ---
[INFO] Packaging webapp
[INFO] Assembling webapp [HelloCamelServletWebApp] in [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/HelloCamelServletWebApp]
[INFO] Processing war project
[INFO] Copying webapp resources [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/src/main/webapp]
[INFO] Webapp assembled in [45 msecs]
[INFO] Building war: /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/HelloCamelServletWebApp.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ HelloCamelServletWebApp ---
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/HelloCamelServletWebApp.war to /Users/jsensharma/.m2/repository/my/camel/servlet/demo/HelloCamelServletWebApp/1.0/HelloCamelServletWebApp-1.0.war
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/pom.xml to /Users/jsensharma/.m2/repository/my/camel/servlet/demo/HelloCamelServletWebApp/1.0/HelloCamelServletWebApp-1.0.pom
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building HelloCamelServletWebApp Demo 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- weblogic-maven-plugin:12.2.1-0-0:deploy (default-cli) @ HelloCamelServletWebApp ---
weblogic.Deployer invoked with options:  -noexit -deploy -username weblogic -name HelloCamelServletWebApp -source /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/HelloCamelServletWebApp.war -upload -adminurl t3://localhost:7001
<Dec 13, 2015 5:49:59 PM IST> <Info> <J2EE Deployment SPI> <BEA-260121> <Initiating deploy operation for application, HelloCamelServletWebApp [archive: /Users/jsensharma/NotBackedUp/MM_Tests/WLS/Camel-on-WebLogic12c/CamelServlet_With_JMSEndpoint_Demo/target/HelloCamelServletWebApp.war], to configured targets.> 
Task 6 initiated: [Deployer:149026]deploy application HelloCamelServletWebApp on AdminServer.
Task 6 completed: [Deployer:149026]deploy application HelloCamelServletWebApp on AdminServer.
Target state: deploy completed on Server AdminServer

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 6.831 s
[INFO] Finished at: 2015-12-13T17:50:01+05:30
[INFO] Final Memory: 37M/699M
[INFO] ------------------------------------------------------------------------

Once the Application is deployed on WebLogic we should be able to see the following kind of output on weblogic logs which indicates that the camel context is initialized.

Output on WebLogic console.


Dec 13, 2015 5:50:00 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Dec 13, 2015 5:50:00 PM org.springframework.web.context.support.XmlWebApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Sun Dec 13 17:50:00 IST 2015]; root of context hierarchy
Dec 13, 2015 5:50:00 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
INFO: Loading XML bean definitions from class path resource [camel-config.xml]
Dec 13, 2015 5:50:00 PM org.apache.camel.impl.DefaultCamelContext start
INFO: Apache Camel 2.16.0 (CamelContext: camel-1) is starting
Dec 13, 2015 5:50:00 PM org.apache.camel.management.ManagedManagementStrategy doStart
INFO: JMX is enabled
Dec 13, 2015 5:50:00 PM org.apache.camel.impl.converter.DefaultTypeConverter doStart
INFO: Loaded 189 type converters
Dec 13, 2015 5:50:00 PM org.apache.camel.impl.DefaultRuntimeEndpointRegistry doStart
INFO: Runtime endpoint registry is in extended mode gathering usage statistics of all incoming and outgoing endpoints (cache limit: 1000)
Dec 13, 2015 5:50:00 PM org.apache.camel.impl.DefaultCamelContext doStartCamel
INFO: AllowUseOriginalMessage is enabled. If access to the original message is not needed, then its recommended to turn this option off as it may improve performance.
Dec 13, 2015 5:50:00 PM org.apache.camel.impl.DefaultCamelContext doStartCamel
INFO: StreamCaching is not in use. If using streams then its recommended to enable stream caching. See more details at http://camel.apache.org/stream-caching.html
Dec 13, 2015 5:50:01 PM org.apache.camel.impl.DefaultCamelContext doStartOrResumeRouteConsumers
INFO: Route: addNumbersRoute started and consuming from: Endpoint[servlet:///addNumbers]
Dec 13, 2015 5:50:01 PM org.apache.camel.impl.DefaultCamelContext start
INFO: Total 1 routes, of which 1 is started.
Dec 13, 2015 5:50:01 PM org.apache.camel.impl.DefaultCamelContext start
INFO: Apache Camel 2.16.0 (CamelContext: camel-1) started in 0.156 seconds
Dec 13, 2015 5:50:01 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 898 ms
Dec 13, 2015 5:50:01 PM org.apache.camel.component.servlet.CamelHttpTransportServlet init
INFO: Initialized CamelHttpTransportServlet[name=CamelServlet, contextPath=/HelloCamelServletWebApp]

Testing the Web Application

Now as the application is deployed on WebLogic 12.2.1 hence lets access the URL and submit the form:

http://localhost:7001/HelloCamelServletWebApp/
OR
http://localhost:7001/HelloCamelServletWebApp/camel/addNumbers?firstNumber=200&secondNumber=300

As soon as we submit the data (two numbers) in the form presented by the application we will be able to see that the JMS Queue has got a JMS Message in it.

Listing JMS Queue Messages on WLS Console

Listing JMS Queue Messages on WLS Console

Source Code:
The Source code for this demo can be found at:

https://github.com/jaysensharma/MiddlewareMagicDemos/tree/master/WebLogic/JMS/Camel-on-WebLogic12c
.
.

Regards
Jay SenSharma


Why and How to use Apache CXF Service in WebLogic 12c ?

Hi,

Why and how to deploy Apache CXF based web service on WebLogic? This is the question we are going to focus as part of this article. First lets see what is apache cxf. Apache CXF implements the JAX-WS APIs which make building web services easy. It allows us generating WSDL from Java classes and generating Java classes from WSDL, Provider API which allows you to create simple messaging receiving server endpoints, Dispatch API which allows you to send raw XML messages to server endpoints.

Apache CXF provides support for the Spring 2.0 XML syntax support and integration. It also enables the development of RESTful services via annotations using the HTTP Binding. The Apache CXF uses Aegis Databinding (2.0.x) which has it;s own databinding library that makes development of code-first web services incredibly easy. The Apache CXF also provides support for variety of WS specifications like WS-Addressing, WS-Policy, WS-ReliableMessaging and WS-Security.

What this demo is about ?

As part of this demo we will see how to use Apache CXF 3.1.4 based WebService on latest WebLogic 12.2.1 (12c). While running this demo we will learn about the following things:

1. How to develop a CXF based WebService using top down approach. Means generating WebService WSDL first and then Creating WebService artifacts (like wrappers, Service interface) from it.

2. How to use the “cxf-codegen-plugin” Maven plugin to generate CXF service artifacts from WSDL.

3. How to deploy the CXF based WebService on WebLogic using WebLogic 12.2.1 using maven plugin “weblogic-maven-plugin”. If you get following kind of error while using this plugin then refer to the article How to use WebLogic 12c provided Maven Synchronization Plug-In ?

4. Invoking the deployed CXF web service using a simple Curl Based Client.

Developing CXF WebService from WSDL

Step-1). First create a directory some where in our filesystem where we will be keeping our projects.

 $ mkdir WebLogic12c_CXF_Demo_Maven

 $ mkdir -p WebLogic12c_CXF_Demo_Maven/src/main/webapp/WEB-INF

 $ mkdir -p WebLogic12c_CXF_Demo_Maven/src/main/resources

 $ mkdir -p WebLogic12c_CXF_Demo_Maven/src/main/java/com/middlewaremagic 

Step-2). Lets start developing a simple WSDL “helloworld.wsdl” and place it inside the “WebLogic12c_CXF_Demo_Maven/src/main/resources/” as following:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<wsdl:definitions xmlns:apachesoap="http://xml.apache.org/xml-soap" 
				  xmlns:impl="http://middlewaremagic.com" 
				  xmlns:intf="http://middlewaremagic.com" 
				  xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" 
			  	  xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/" 
				  xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
				  targetNamespace="http://middlewaremagic.com">

 <wsdl:types>
  <schema xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://middlewaremagic.com">
   <element name="sayHello">
    <complexType>
     <sequence>
      <element name="name" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>
   <element name="sayHelloResponse">
    <complexType>
     <sequence>
      <element name="sayHelloReturn" type="xsd:string"/>
     </sequence>
    </complexType>
   </element>
  </schema>
 </wsdl:types>

   <wsdl:message name="sayHelloResponse">
      <wsdl:part element="impl:sayHelloResponse" name="parameters">
      </wsdl:part>
   </wsdl:message>

   <wsdl:message name="sayHelloRequest">
      <wsdl:part element="impl:sayHello" name="parameters">
      </wsdl:part>
   </wsdl:message>

   <wsdl:portType name="HelloWorld">
      <wsdl:operation name="sayHello">
         <wsdl:input message="impl:sayHelloRequest" name="sayHelloRequest">
       </wsdl:input>
         <wsdl:output message="impl:sayHelloResponse" name="sayHelloResponse">
       </wsdl:output>
      </wsdl:operation>
   </wsdl:portType>
   
   <wsdl:binding name="HelloWorldSoapBinding" type="impl:HelloWorld">
      <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
      <wsdl:operation name="sayHello">
         <wsdlsoap:operation soapAction=""/>
         <wsdl:input name="sayHelloRequest">
            <wsdlsoap:body use="literal"/>
         </wsdl:input>
         <wsdl:output name="sayHelloResponse">
            <wsdlsoap:body use="literal"/>
         </wsdl:output>
      </wsdl:operation>
   </wsdl:binding>
   
   <wsdl:service name="HelloWorldService">
      <wsdl:port binding="impl:HelloWorldSoapBinding" name="HelloWorld">
         <wsdlsoap:address location="http://localhost:7001/WebLogic_CXF_Demo/services/HelloWorld"/>
      </wsdl:port>
   </wsdl:service>   
   
</wsdl:definitions>

Step-3). Now lets write a simple “pom.xml” file inside the “WebLogic12c_CXF_Demo_Maven” directory as following where we will use the “cxf-codegen-plugin” plugin’s “wsdl2java” goal to generate the WebService artifacts like helper classes, implementation class and the webservice interface..etc


<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>middleware.magic</groupId>
    <artifactId>WebLogic12c_CXF_Demo</artifactId>
    <packaging>war</packaging>
    <name>WSDL first demo on WenLogic 12.2.1</name>
    <version>1.0</version>
    <description>A very simple demo showing how to develop and use a CXF based WebService on WebLogic 12.2.1</description>

    <properties>
        <cxf.version>3.1.4</cxf.version>
        <cxf.xjc-utils.version>3.0.5</cxf.xjc-utils.version>
        <spring.version>4.1.4.RELEASE</spring.version>
    </properties>
    
    <build>
        <defaultGoal>install</defaultGoal>
        <finalName>WebLogic_CXF_Demo</finalName>   <!-- WAR name -->
        
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-war-plugin</artifactId>
                    <version>2.1</version>
                    <configuration>
                        <webXml>src/main/webapp/WEB-INF/web.xml</webXml>
                        <webResources>
                            <resource>
                                <directory>src/main/resources</directory>
                                <targetPath>WEB-INF</targetPath>
                                <includes>
                                    <include>*.wsdl</include>
                                </includes>
                            </resource>
                        </webResources>
                    </configuration>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
        
        <plugins>
            <plugin>
                <groupId>org.apache.cxf</groupId>
                <artifactId>cxf-codegen-plugin</artifactId>
                <version>${cxf.version}</version>
                <executions>
                    <execution>
                        <id>generate-sources</id>
                        <phase>generate-sources</phase>
                        <configuration>
                            <wsdlOptions>
                                <wsdlOption>
                                    <wsdl>src/main/resources/helloworld.wsdl</wsdl>  <!-- Where the original WSDL is present -->
                                    <wsdlLocation>WEB-INF/wsdl/helloworld.wsdl</wsdlLocation>  <!-- Where to place the WSDL -->
                                    <bindingFiles>
                                        <bindingFile>src/main/resources/binding.xml</bindingFile>
                                    </bindingFiles>
                                    <extraargs>
                                        <extraarg>-impl</extraarg>  <!-- will generate a dummy  webservice implementation -->
                                        <extraarg>-verbose</extraarg>
                                    </extraargs>
                                </wsdlOption>
                            </wsdlOptions>
                        </configuration>
                        <goals>
                            <goal>wsdl2java</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>    


            <plugin> 
              <groupId>com.oracle.weblogic</groupId> 
              <artifactId>weblogic-maven-plugin</artifactId> 
              <version>12.2.1-0-0</version> 
              <configuration> 
                  <adminurl>t3://localhost:7001</adminurl>
                  <user>weblogic</user> 
                  <password>weblogic1</password> 
                  <upload>true</upload> 
                  <action>deploy</action> 
                  <remote>false</remote> 
                  <verbose>true</verbose> 
                  <source>${project.build.directory}/${project.build.finalName}.${project.packaging}</source> 
                  <name>${project.build.finalName}</name> 
              </configuration> 
           </plugin>                   
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-frontend-jaxws</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf</groupId>
            <artifactId>cxf-rt-transports-http</artifactId>
            <version>${cxf.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.cxf.xjc-utils</groupId>
            <artifactId>cxf-xjc-runtime</artifactId>
            <version>${cxf.xjc-utils.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>${spring.version}</version>
       </dependency>
    </dependencies>
</project>

Step-4). Now if users want to provide their own custom binding then they can add the “binding.xml” file inside the “WebLogic12c_CXF_Demo_Maven/src/main/resources/” directory as following, Here i am putting a dummy file without having much information in it:

<jaxws:bindings wsdlLocation="helloworld.wsdl"
          xmlns:jaxws="http://java.sun.com/xml/ns/jaxws"
          xmlns:xs="http://www.w3.org/2001/XMLSchema"
          xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
          xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
          
		<jaxws:bindings  node="wsdl:definitions/wsdl:types/xs:schema">
			<jxb:globalBindings>
			</jxb:globalBindings>
		</jaxws:bindings>
		
</jaxws:bindings>

Step-5). Now lets run the maven to build the above project which will internally read the WSDL and generate the WebService Artifacts along with a dummy implementation class which later we will modify according to our need. So open a terminal and run the following commands in order to set the maven properly.
For Unix Based OS

$ export M2_HOME=/PATH/TO/apache_maven_3.2.3
$ export JAVA_HOME=/PATH/TO/jdk1.8.0_60
$ export PATH=$JAVA_HOME/bin:/PATH/TO/apache_maven_3.2.3/bin:$PATH

$ cd /WebLogic12c_CXF_Demo_Maven
$ mvn clean install

For Windows Based OS

$ set M2_HOME=C:\PATH\TO\apache_maven_3.2.3
$ set JAVA_HOME=C:\PATH\TO\jdk1.8.0_60
$ set PATH=%JAVA_HOME%/bin;C:\PATH\TO\apache_maven_3.2.3\bin;%PATH%

$ cd C:\WebLogic12c_CXF_Demo_Maven
$ mvn clean install 

As soon as you will run the “mvn clean install” the web service artifacts will be generated as following:

$ mvn clean install
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building WSDL first demo on WenLogic 12.2.1 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ WebLogic12c_CXF_Demo ---
[INFO] Deleting /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target
[INFO] 
[INFO] --- cxf-codegen-plugin:3.1.4:wsdl2java (generate-sources) @ WebLogic12c_CXF_Demo ---
Loading FrontEnd jaxws ...
Loading DataBinding jaxb ...
wsdl2java -d /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/generated-sources/cxf -b file:/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources/binding.xml -impl -verbose -wsdlLocation WEB-INF/helloworld.wsdl file:/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources/helloworld.wsdl
wsdl2java - Apache CXF 3.1.4

[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ WebLogic12c_CXF_Demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ WebLogic12c_CXF_Demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 7 source files to /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ WebLogic12c_CXF_Demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ WebLogic12c_CXF_Demo ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ WebLogic12c_CXF_Demo ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-war-plugin:2.1:war (default-war) @ WebLogic12c_CXF_Demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [WebLogic12c_CXF_Demo] in [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo]
[INFO] Processing war project
[INFO] Copying webapp webResources [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources] to [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo]
[INFO] Copying webapp resources [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/webapp]
[INFO] Webapp assembled in [55 msecs]
[INFO] Building war: /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ WebLogic12c_CXF_Demo ---
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war to /Users/jsensharma/.m2/repository/middleware/magic/WebLogic12c_CXF_Demo/1.0/WebLogic12c_CXF_Demo-1.0.war
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/pom.xml to /Users/jsensharma/.m2/repository/middleware/magic/WebLogic12c_CXF_Demo/1.0/WebLogic12c_CXF_Demo-1.0.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.320 s
[INFO] Finished at: 2015-11-14T11:52:19+05:30
[INFO] Final Memory: 23M/245M
[INFO] ------------------------------------------------------------------------

Updating WebService Impl and deploying on WLS12c

Step-6). After running the above “cxf-codegen-plugin” task “wsdl2java” it will create some artifacts (WebService interface and helper and impementation classes) from the WSDL. We can see that the following kind of web service implementation class “HelloWorldImpl.java” would have been generated inside the “WebLogic12c_CXF_Demo_Maven/target/generated-sources/cxf/com/middlewaremagic”


/**
 * Please modify this class to meet your needs
 * This class is not complete
 */

package com.middlewaremagic;

import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

/**
 * This class was generated by Apache CXF 3.1.4
 * 2015-11-14T11:52:18.278+05:30
 * Generated source version: 3.1.4
 * 
 */

@javax.jws.WebService(
                      serviceName = "HelloWorldService",
                      portName = "HelloWorld",
                      targetNamespace = "http://middlewaremagic.com",
                      wsdlLocation = "WEB-INF/helloworld.wsdl",
                      endpointInterface = "com.middlewaremagic.HelloWorld")
                      
public class HelloWorldImpl implements HelloWorld {

    private static final Logger LOG = Logger.getLogger(HelloWorldImpl.class.getName());

    /* (non-Javadoc)
     * @see com.middlewaremagic.HelloWorld#sayHello(java.lang.String  name )*
     */
    public java.lang.String sayHello(java.lang.String name) { 
        LOG.info("Executing operation sayHello");
        System.out.println(name);
        try {
            java.lang.String _return = "";
            return _return;
        } catch (java.lang.Exception ex) {
            ex.printStackTrace();
            throw new RuntimeException(ex);
        }
    }

}

Step-7). As we see a dummy WebService implementation class is generated as above by CXF, Hence lets customize it base don our need. Lets Copy the above file “HelloWorldImpl.java” from “WebLogic12c_CXF_Demo_Maven/target/generated-sources/cxf/com/middlewaremagic” to “WebLogic12c_CXF_Demo_Maven/src/main/java/com/middlewaremagic”

 $ cp -f WebLogic12c_CXF_Demo_Maven/target/generated-sources/cxf/com/middlewaremagic/HelloWorldImpl.java  WebLogic12c_CXF_Demo_Maven/src/main/java/com/middlewaremagic

Once we copied the above file then edit the “pom.xml” file to make sure that the following tag is commented or removed. So that when we do the “mvn clean build”

        <extraargs>
            <!-- <extraarg>-impl</extraarg> -->  <!-- REMOVE THIS LINE  -->
            <extraarg>-verbose</extraarg>
        </extraargs>

Step-8). Now lets edit the “WebLogic12c_CXF_Demo_Maven/src/main/java/com/middlewaremagic/HelloWorldImpl.java” file and then provide our own implementation.

package com.middlewaremagic;

import java.util.logging.Logger;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;

@javax.jws.WebService(
                      serviceName = "HelloWorldService",
                      portName = "HelloWorld",
                      targetNamespace = "http://middlewaremagic.com",
                      wsdlLocation = "WEB-INF/helloworld.wsdl",
                      endpointInterface = "com.middlewaremagic.HelloWorld")
                      
public class HelloWorldImpl implements HelloWorld {

    private static final Logger LOG = Logger.getLogger(HelloWorldImpl.class.getName());

    public java.lang.String sayHello(java.lang.String name) { 
        System.out.println("\n\t [HelloWorld_Impl] sayHello("+name+") invoked.");
        return "Hello World !!! Mr. "+ name + " at " + new java.util.Date();
    }
}

Step-9). Before deploying the above application lets make sure to add the “web.xml” file inside the “WebLogic12c_CXF_Demo_Maven/src/main/webapp/WEB-INF/” as following:

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
      version="3.0"> 
    <display-name>wls_cxf_demo</display-name>
    <servlet>
        <servlet-name>cxf</servlet-name>
        <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>cxf</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>
</web-app>

Step-10). The most important part now, is to add the following kind of CXF specific “cxf-servlet.xml” file inside the “WebLogic12c_CXF_Demo_Maven/src/main/webapp/WEB-INF/” as following:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:jaxws="http://cxf.apache.org/jaxws"
      xmlns:soap="http://cxf.apache.org/bindings/soap"
      xsi:schemaLocation="
             http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
             http://cxf.apache.org/bindings/soap http://cxf.apache.org/schemas/configuration/soap.xsd
             http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd">

    <jaxws:endpoint xmlns:hello="http://middlewaremagic.com/"
            id="HelloWorldHTTP" address="/HelloWorld"
            serviceName="hello:HelloWorldService" endpointName="hello:HelloWorldPort"
            implementor="com.middlewaremagic.HelloWorldImpl">
    </jaxws:endpoint>

</beans>

Step-11). Now lets do a clean build again with the “weblogic:deploy” plugin to deploy it on WebLogic.



$ mvn clean install weblogic:deploy


[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building WSDL first demo on WenLogic 12.2.1 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ WebLogic12c_CXF_Demo ---
[INFO] Deleting /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target
[INFO] 
[INFO] --- cxf-codegen-plugin:3.1.4:wsdl2java (generate-sources) @ WebLogic12c_CXF_Demo ---
Loading FrontEnd jaxws ...
Loading DataBinding jaxb ...
wsdl2java -d /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/generated-sources/cxf -b file:/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources/binding.xml -verbose -wsdlLocation WEB-INF/wsdl/helloworld.wsdl file:/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources/helloworld.wsdl
wsdl2java - Apache CXF 3.1.4

[INFO] 
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ WebLogic12c_CXF_Demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 2 resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ WebLogic12c_CXF_Demo ---
[INFO] Changes detected - recompiling the module!
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 7 source files to /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ WebLogic12c_CXF_Demo ---
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ WebLogic12c_CXF_Demo ---
[INFO] No sources to compile
[INFO] 
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ WebLogic12c_CXF_Demo ---
[INFO] No tests to run.
[INFO] 
[INFO] --- maven-war-plugin:2.1:war (default-war) @ WebLogic12c_CXF_Demo ---
[INFO] Packaging webapp
[INFO] Assembling webapp [WebLogic12c_CXF_Demo] in [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo]
[INFO] Processing war project
[INFO] Copying webapp webResources [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/resources] to [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo]
[INFO] Copying webapp resources [/Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/src/main/webapp]
[INFO] Webapp assembled in [66 msecs]
[INFO] Building war: /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war
[INFO] WEB-INF/web.xml already added, skipping
[INFO] 
[INFO] --- maven-install-plugin:2.4:install (default-install) @ WebLogic12c_CXF_Demo ---
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war to /Users/jsensharma/.m2/repository/middleware/magic/WebLogic12c_CXF_Demo/1.0/WebLogic12c_CXF_Demo-1.0.war
[INFO] Installing /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/pom.xml to /Users/jsensharma/.m2/repository/middleware/magic/WebLogic12c_CXF_Demo/1.0/WebLogic12c_CXF_Demo-1.0.pom
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building WSDL first demo on WenLogic 12.2.1 1.0
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- weblogic-maven-plugin:12.2.1-0-0:deploy (default-cli) @ WebLogic12c_CXF_Demo ---
[INFO] Command flags are: -noexit -deploy -username weblogic -password ******* -name WebLogic_CXF_Demo -source /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war -upload -verbose -adminurl t3://localhost:7001
weblogic.Deployer invoked with options:  -noexit -deploy -username weblogic -name WebLogic_CXF_Demo -source /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war -upload -verbose -adminurl t3://localhost:7001
<Nov 14, 2015 12:51:48 PM IST> <Info> <J2EE Deployment SPI> <BEA-260121> <Initiating deploy operation for application, WebLogic_CXF_Demo [archive: /Users/jsensharma/NotBackedUp/MM_Tests/WLS/WebLogic12c_CXF_Demo_Maven/target/WebLogic_CXF_Demo.war], to configured targets.> 
Task 6 initiated: [Deployer:149026]deploy application WebLogic_CXF_Demo on AdminServer.
Task 6 completed: [Deployer:149026]deploy application WebLogic_CXF_Demo on AdminServer.
Target state: deploy completed on Server AdminServer

Target Assignments:
+ WebLogic_CXF_Demo  AdminServer
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 11.753 s
[INFO] Finished at: 2015-11-14T12:51:50+05:30
[INFO] Final Memory: 38M/502M
[INFO] ------------------------------------------------------------------------

Running Curl Based WebSerivce Client

Step-12). As the web service is deployed hence lets try accessing the WSDL and the service endpoint information from WLS server by accessing the following URL:

http://localhost:7001/WebLogic_CXF_Demo/services
And
http://localhost:7001/WebLogic_CXF_Demo/services/HelloWorld?wsdl

Step-13). Now lets create a SOAP request XML which we will send to the web service. Hence write the “soap_request.xml” file inside the any directory of your choice like “WebLogic12c_CXF_Demo_Maven//client”

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:mid="http://middlewaremagic.com">
   <soapenv:Header/>
   <soapenv:Body>
      <mid:sayHello>
         <mid:name>MiddlewareMagic!!!</mid:name>
      </mid:sayHello>
   </soapenv:Body>
</soapenv:Envelope>

Step-14). Also lets write a simple CURL based command which will send the above SOAP request to the WebService endpoint. Write the following file “request.sh” inside the “WebLogic12c_CXF_Demo_Maven/client”

## A simple "curl" based SOAP Request 
## Which will invoke the HelloWorld Service:

request=`cat soap_request.xml`
curl -s -H "Content-Type: text/xml" -d "$request" http://localhost:7001/WebLogic_CXF_Demo/services/HelloWorld
echo

Step-15). Run the client to access the WebService and to receive the response.

  $ cd WebLogic12c_CXF_Demo_Maven/client

  $ chmod 755 ./request.sh 

  $ ./request.sh

        <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
            <soap:Body>
               <sayHelloResponse xmlns="http://middlewaremagic.com">
                   <sayHelloReturn>Hello World !!! Mr. MiddlewareMagic!!! at Sat Nov 14 12:59:32 IST 2015</sayHelloReturn>
               </sayHelloResponse>
            </soap:Body>
       </soap:Envelope>

.
.
Source code for this demo is present in:
https://github.com/jaysensharma/MiddlewareMagicDemos/tree/master/WebLogic/WebService/WebLogic12c_CXF_Demo_Maven

.
.
Regards
Jay SenSharma


How to use WebLogic 12c provided Maven Synchronization Plug-In ?

Hi,

Maven based development and deployment is the choice of most of the developers. WebLogic 12c has worked a lot on that direction.

Oracle Fusion Middleware 12c provides Maven Synchronization plug-in that simplifies the process of setting up repositories and completely eliminates the need to know what patches are installed in a particular environment.

Oracle homes in 12c contain maven directories which contain Maven Project Object Models (POMs) for artifacts provided by Oracle, archetypes for creating projects, and Maven plug-ins provided by Oracle, for executing various build operations.

WebLogic 12c (12.2.1.0) also provides “org.apache.maven_3.2.5” inside it, Which can be used to run Maven in your machines.

    export M2_HOME=/PATH/TO/wls1221/oracle_common/modules/org.apache.maven_3.2.5

As part of this example we will see how to install the Oracle Maven Synchronization Plug-In. Few things to remember while going through this article:

Point-1). The default maven local repository location is in the “${HOME}/.m2/repository” directory.

Point-2). For this demo we are using “Oracle WebLogic Server 12.2.1 (12c)” which can be downloaded from: http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html

Point-3). Even if WebLogic 12c provides it’s own Maven installation, we are using our own Maven Installation. Users can use any maven of their choice.

Setting up Classpath and Maven Environment.

Step-1). First of all we will set the environment variables and the ClassPath by running the “setWLSEnv.sh” script.

   $ cd /Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/server/bin

   $ ./setWLSEnv.sh 

   $ export MW_HOME=/Users/jsensharma/NotBackedUp/Installed/wls1221

If JAVA_HOME is not set then please set that as well in the same command prompt.
Deploy the plugin as following:

Installing Oracle Maven Synchronization plug-in in Local Maven Repo

Step-2). Before we start using the “Oracle Maven Synchronization Plug-In” we will need to install it in our local repository (default: “${HOME}/.m2/repository”) on your computer, or We can also deploy it into our shared internal repository. So Lets run the following command, Make sure to move to the below mentioned directory before running the command mentioned below:

   
   $ cd /Users/jsensharma/NotBackedUp/Installed/wls1221/oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1
   
   $ mvn deploy:deploy-file -DpomFile=oracle-maven-sync-12.2.1.pom -Dfile=oracle-maven-sync-12.2.1.jar -Durl=file:///Users/jsensharma/.m2/repository
    .
    .
    . 
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-deploy-plugin:2.7:deploy-file (default-cli) @ standalone-pom ---
Uploading: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.jar
Uploaded: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.jar (71 KB at 3509.6 KB/sec)
Uploading: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.pom
Uploaded: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.pom (9 KB at 8366.2 KB/sec)
Downloading: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/maven-metadata.xml
Uploading: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/maven-metadata.xml
Uploaded: file:///Users/jsensharma/.m2/repository/com/oracle/maven/oracle-maven-sync/maven-metadata.xml (355 B at 346.7 KB/sec)
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.368 s
[INFO] Finished at: 2015-11-03T12:35:46+05:30
[INFO] Final Memory: 7M/245M
[INFO] ------------------------------------------------------------------------

Here the “/Users/jsensharma/.m2/repository” is my default local maven repository path.
NOTE: Please do not use “~” to define the “-Durl” else you mat encounter issues later.

Observation-1). If you will not define the “-Durl” parameter to define your local repository path here then you may get the following kind of error :

   $ mvn deploy:deploy-file -DpomFile=oracle-maven-sync-12.2.1.pom -Dfile=oracle-maven-sync-12.2.1.jar
   .
   .
   .
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-deploy-plugin:2.7:deploy-file (default-cli) @ standalone-pom ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.318 s
[INFO] Finished at: 2015-11-02T13:59:15+05:30
[INFO] Final Memory: 6M/245M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file (default-cli) on project standalone-pom: The parameters 'url' for goal org.apache.maven.plugins:maven-deploy-plugin:2.7:deploy-file are missing or invalid -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginParameterException

Running Oracle Maven Synchronization plug-in

Step-3). Now lets try to run the “Oracle Maven Synchronization plug-in” to see if everything is working fine or not.

  .
  .
  $ mvn help:describe -Dplugin=com.oracle.maven:oracle-maven-sync:12.2.1-0-0 -Ddetail  
  
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-help-plugin:2.2:describe (default-cli) @ standalone-pom ---
[INFO] com.oracle.maven:oracle-maven-sync:12.2.1-0-0

Name: Oracle Maven Synchronization Plugin
Description: Maven plugin to load a Maven repository with the contents of the
  Oracle Home directory
Group Id: com.oracle.maven
Artifact Id: oracle-maven-sync
Version: 12.2.1-0-0
Goal Prefix: oracle-sync

This plugin has 2 goals:

oracle-sync:help
  Description: Display help.
  Implementation: com.oracle.maven.sync.ODMHelp
  Language: java

  This mojo doesn't use any parameters.

oracle-sync:push
  Description: Install to the local repository and optionally deploy to a
    remote repository from the specified oracle home
    
    
    The plugin will use your current Maven settings to determine the path to
    the local repository and, optionally, a remote deployment repository. For
    details on how to configure Maven's repository settings, see the Maven
    settings reference: http://maven.apache.org/settings.html
    
    You can specify the parameters on the command line like this:
    -DserverId=archiva-internal -DdryRun=false -DfailOnError=false
    
    To override the localRepository target used by the plugin, you can specify
    the following option on the command-line:
    -Dmaven.local.repo=/alternate/path/to/repository
    
    To supply an alternate settings.xml for purposes of this operation, use the
    --settings option. For example:
    
     mvn --settings /alternate/path/settings.xml ... 
    ...or in your POM like this:
     <plugin>
         <groupId>com.oracle.maven</groupId>
         <artifactId>oracle-maven-sync</artifactId>
         <version>12.2.1-0-0</version>
         <configuration>
           <oracleHome>/home/mark/Oracle/Middleware</oracleHome>
           <failOnError>false</failOnError>
         </configuration>
       </plugin> 
  Implementation: com.oracle.maven.sync.ODMPushMojo
  Language: java

  Available parameters:

    dryRun (Default: false)
      User property: dryRun
      If set to 'true' this goal execution will only log push actions but will
      not actually make any changes.

    failOnError (Default: true)
      User property: failOnError
      If set to 'true' the plugin will stop and return an error immediately
      upon the first failure to deploy an artifact. Otherwise, the plugin will
      log the error and attempt to complete deployment of all other artifacts.

    localRepository (Default: ${localRepository})
      Provide an alternate local repository path to install pushed artifacts
      to.

    oracleHome
      User property: oracleHome
      Path to the Oracle home.
      Required.

    overwriteParent (Default: false)
      User property: overwriteParent
      If true, the plugin will overwrite POM artifacts with ancestry to
      oracle-common if they exist in the target repository. The default value
      of false will prevent automatic overwrite of customized POM contents. If
      any such POMs are encountered during plugin execution, an error will be
      thrown and handled according to the failOnError flag value. To carry over
      changes, save the existing POMs, run the push goal with
      overwriteParent=true and manually transfer the changes to the newly
      pushed POMs.

    pushDuplicates (Default: false)
      User property: pushDuplicates
      Push all duplicate locations. If multiple POMs with different Maven
      coordinates (GAV) are assigned to the same location path, the plugin will
      push them all to the destination repository if this flag is true.
      If the value is false, the push operation will fail. Set failOneError to
      false if you would like to skip all duplicates except the GAV in the set
      of duplicates that is encountered first.

    serverId
      User property: serverId
      This is the ID of the server (repository) in your settings.xml file -
      where you have specified the remote Maven repository and its
      authentication information. The plugin will only install to the local
      repository if this parameter is not set.


[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.880 s
[INFO] Finished at: 2015-11-03T12:43:43+05:30
[INFO] Final Memory: 9M/245M
[INFO] ------------------------------------------------------------------------

Observation-2). Just in case if you encounter the following error while running the above command, Then make sure that in the previous step while running the “mvn deploy:deploy-file” you specified the fully qualified PATH for the “-Durl”. (Do not use ~ character while defining the URL)

$ mvn help:describe -Dplugin=com.oracle.maven:oracle-maven-sync:12.2.1-0-0 -Ddetail  

.
.
$ mvn help:describe -Dplugin=com.oracle.maven:oracle-maven-sync:12.2.1-0-0 -Ddetail  
[INFO] Scanning for projects...
Downloading: https://repo.maven.apache.org/maven2/com/oracle/maven/maven-metadata.xml
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- maven-help-plugin:2.2:describe (default-cli) @ standalone-pom ---
Downloading: https://repo.maven.apache.org/maven2/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.pom
[WARNING] The POM for com.oracle.maven:oracle-maven-sync:jar:12.2.1-0-0 is missing, no dependency information available
Downloading: https://repo.maven.apache.org/maven2/com/oracle/maven/oracle-maven-sync/12.2.1-0-0/oracle-maven-sync-12.2.1-0-0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.425 s
[INFO] Finished at: 2015-11-03T12:37:40+05:30
[INFO] Final Memory: 10M/245M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-help-plugin:2.2:describe (default-cli) on project standalone-pom: Plugin does not exist: Plugin could not be found, please check its coordinates for typos and ensure the required plugin repositories are defined in the POM
[ERROR] com.oracle.maven:oracle-maven-sync:maven-plugin:12.2.1-0-0
[ERROR] 
[ERROR] from the specified remote repositories:
[ERROR] central (https://repo.maven.apache.org/maven2, releases=true, snapshots=false)
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR] 
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

NOTE:
It is always better to add the “pluginGroup” inside the “/Users/jsensharma/.m2/settings.xml” (${user.home}/.m2/settings.xml) file as following:

<?xml version="1.0" encoding="UTF-8"?> 
<settings xmlns="http://maven.apache.org/settings/1.0.0"  
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"> 
  <pluginGroups> 
    <pluginGroup>com.oracle.maven</pluginGroup>
  </pluginGroups>  
</settings>

Populating the local repository

Now as the plugin is setup properly hence we will now go ahead and push the WebLogic JARs to the Maven repository. We will achieve it by using the “com.oracle.maven:oracle-maven-sync” command as following:


mvn com.oracle.maven:oracle-maven-sync:12.2.1-0-0:push -Doracle-maven-sync.oracleHome=/Users/jsensharma/NotBackedUp/Installed/wls1221 -DtestingOnly=false

Article is done here. Following part is just to simplify this whole above mentioned lengthy process. So i have written following kind of very simple shell script to automate these steps.
.
.
.
.
.

Simplified Shell Script to Do the Above

I have written the following kind of simple Shell script “weblogic_maven_sync.sh” which will make this whole task easy. Just make sure to set the Variables properly in this script.

export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
echo "JAVA_HOME = $JAVA_HOME"
echo 
export M2_HOME=/Users/jsensharma/NotBackedUp/Support_Tools/apache_maven_3.2.3
echo "M2_HOME = $M2_HOME"
echo
export M2_REPO=/Users/jsensharma/.m2/repository
echo "M2_REPO=$M2_REPO"
echo
export MW_HOME=/Users/jsensharma/NotBackedUp/Installed/wls1221
echo "MW_HOME = $MW_HOME"
echo
export PATH=$JAVA_HOME/bin:/Users/jsensharma/NotBackedUp/Support_Tools/apache_maven_3.2.3/bin:$PATH:
echo "PATH = $PATH"

cd $MW_HOME//wlserver/server/bin
. ./setWLSEnv.sh

cd $MW_HOME/oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1

mvn deploy:deploy-file -DpomFile=oracle-maven-sync-12.2.1.pom -Dfile=oracle-maven-sync-12.2.1.jar -Durl=file://${M2_REPO}

mvn help:describe -Dplugin=com.oracle.maven:oracle-maven-sync:12.2.1-0-0 -Ddetail  

mvn com.oracle.maven:oracle-maven-sync:12.2.1-0-0:push -Doracle-maven-sync.oracleHome=$MW_HOME -DtestingOnly=false

mvn archetype:crawl -Dcatalog=$HOME/.m2/archetype-catalog.xml

.
.

Known Issue

While running this script or while manually following these steps you might face the following error, which seems to be because of bad “org/apache/maven/doxia/doxia-sink-api/1.1/doxia-sink-api-1.1.pom” pom , Contact Apache regarding this:

[INFO] ------------------------------------------------------------------------
[INFO] ISSUE DETAILS:
[INFO] ------------------------------------------------------------------------
[INFO]  POM PARSE ERROR : 
[INFO]  ISSUE #1: /Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/../oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1/~/.m2/repository/org/apache/maven/doxia/doxia-sink-api/1.1/doxia-sink-api-1.1.pom
   Failed to parse POM at "/Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/../oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1/~/.m2/repository/org/apache/maven/doxia/doxia-sink-api/1.1/doxia-sink-api-1.1.pom".  Repository copy will not be performed for this artifact    POM /Users/jsensharma/NotBackedUp/Installed/wls1221/wlserver/../oracle_common/plugins/maven/com/oracle/maven/oracle-maven-sync/12.2.1/~/.m2/repository/org/apache/maven/doxia/doxia-sink-api/1.1/doxia-sink-api-1.1.pom appears to be missing a necessary GAV component: G:A:V:P null:doxia-sink-api:null:jar
[INFO]    
[INFO] 
[INFO] IMPORTANT NOTE
[INFO] This operation may have added/updated archetypes in your repository.
[INFO] To update your archetype catalog, you should run:
[INFO] 'mvn archetype:crawl -Dcatalog=$HOME/.m2/archetype-catalog.xml'

.
.
Source Code
Please find this script in the MiddlewareMagicDemos Github repo.
https://github.com/jaysensharma/MiddlewareMagicDemos/tree/master/WebLogic/Maven/Maven_Synchronization_Plug-In
.
.
Regards
Jay SenSharma


Copyright © 2010-2012 Middleware Magic. All rights reserved. |