Wednesday, 6 July 2016

Run programs directly from your Blog or Website

Update 2022: JDoodle provides 4 options to include IDE to a blog/website. This article just covers one of them. Please refer JDoodle Documentation for more details.
How nice it would be if the programs in your website/blog is directly executable without copying to an editor. Yes now it is possible with JDoodle.com.

JDoodle is an online compiler and editor for Java, C, C++ and many more languages, now using JDoodle you can make the programs in your website executable for around 76+ languages supported by JDoodle. Below is a sample program which you can execute from this blog itself.




Below is an another Java Program where you can pass Input Parameters to the program



Below is an another Java Program where you can pass Standard Input (STDIN) inputs to the program



Including executable programs into your website/blog is easy


  • Goto JDoodle.com
  • Sign-in, if you don't have an account create one, it just takes a minute.
  • select the language in which you want to write program
  • create a program
  • save the program
  • click on Others --> Share/Embed
  • copy embed url 
  • Goto your website insert the copied url in a div as follows
    • <div data-pym-src="https://www.jdoodle.com/embed/v0/2?stdin=0&arg=0"></div>
  • include the below at bottom  of the Blog Post or Website
    • <script src="https://www.jdoodle.com/assets/jdoodle-pym.min.js" type="text/javascript"></script>

By Default embed url will display the stdin (for all languages) and arguments (java only) input boxes, they can be disabled by passing following parameters

stdin=0 (hide stdin box), arg=0 (hide argument box), changing from 0 to 1 will display the boxes.
To make the plugin writeable use rw=1 parameter in the url
To set default values for arguments use "set_args" parameter.
Alternatively you can access your shared programs in 3 different plain format (xml, json, text) by just adding format parameter at the end of your shared url. Below are some examples



Alternatively if you want to redirect your user to JDoodle with the code snippet you want, you can just post your code to JDoodle as follows

<form action="https://www.jdoodle.com/api/redirect-to-post/online-java-compiler" method="post">
  Script: <textarea name="initScript" rows="8" cols="80"></textarea>
  <input type="submit" value="Submit">
</form>

Just replace "/online-java-compiler" with the compiler url you want to redirect to. For example if you want to redirect to C compiler use -  "https://www.jdoodle.com/api/redirect-to-post/c-online-compiler"


Please contact JDoodle and inform if you are embedding code in your site, so that they can update regarding embed functionality in advance if any.

if you are using Wordpress, there is a nice plugin you can use - JDoodle Plugin for WordPress, Please note: This wordpress plugin is 3rd Party Plugin, Thanks to Vikor for developing this, JDoodle is not responsible for this plugin in anyway including content, function, update and maintenance.

Saturday, 7 February 2015

Hapijs in Openshift

Today I tried to host a small Hapijs app in Openshift, as it may be useful for others just documenting here,

Creating new Gear with Nodejs cartridge in Openshift

  1.  Goto https://openshift.redhat.com/app/console/applications 
  2. Click Add application and add nodejs cartridge
Create a Hapijs Application

  1.  clone the project just created in openshift. 
  2.  delete all the files/folders except .openshift folder (note: make sure files deleted in git as well)
  3.  create new hapijs project on the same folder (refer: http://hapijs.com/tutorials)
    • npm init
    • npm install --save hapi
  4. create a file called index.js with following content
#!/bin/env node
var Hapi = require('hapi');

// Create a server with a host and port
var server = new Hapi.Server();

var ipaddress = process.env.OPENSHIFT_NODEJS_IP;
var port      = process.env.OPENSHIFT_NODEJS_PORT || 8080;

if (typeof ipaddress === "undefined") {
    //  Log errors on OpenShift but continue w/ 127.0.0.1 - this allows us to run/test the app locally.
    console.warn('No OPENSHIFT_NODEJS_IP var, using 127.0.0.1');
    ipaddress = "127.0.0.1";
};

server.connection({
    host: ipaddress,
    port: port});

// Add the route
server.route({
    method: 'GET',
    path:'/',
    handler: function (request, reply) {
        reply.file('Hello World!!!');
    }
});

// Start the server
server.start();

Test it locally and push it to openshit, enjoy coding.

Sunday, 28 December 2014

Website Review Tool - Alternative to woorank

Website creation involves lot of things, Especially the search engine and mobile friendliness needs lot of factors to be maintained like,

1. load time
2. backlinks
3. social popularity
4. page rank
5. sitemap.xml and robots.txt
6. Html fitness
7. keyword positioning
8. security
9. Trust worthiness of your site
10. etc, etc.

Periodically checking these factors is very important to keep your search engine ranking and to attract more users. Using different tools to check different factors will take lot of time.

This post introduces a free online WebSite/SEO Review Tool called - Htmlbee.com, which reviews websites for so many factors in single click.


By using Htmlbee.com you can review your website for

1. Social Media positon
2. Google - Rank, pagespeed
3. Resource statistics
4. Html correctness/fitness
5. Performance
6. Keyword analysis
7. and many more (almost 45 slides with 100 items).

The good thing about this review is, it explains importance of each and every factor with your position. It gives lot of wealthy information about each review points on your site with authenticated reference links (mostly Googles Webmaster).

Once you click on the review button, it makes you wait for few seconds to collect all the information about your site (unlike few other review sites which displays partial informations and confuse), and presents all the information in a good slide format, which can be navigated using arrow keys or by swipe(in mobiles).

Even you can print the report in well formatted manner.

Below are some sample screens from the Htmlbee.com,







Remember Htmlbee.com is still in Beta, Check how your website doing today and share your comments here, Thanks.



Sunday, 21 July 2013

Grails - Broken Pipe and Cannot release connection

In one of my grails applications, I was getting the following exception often,

java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3832)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2471)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2651)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2734)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2322)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
at org.grails.datastore.gorm.GormStaticApi$_methodMissing_closure2.doCall(GormStaticApi.groovy:108)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
2013-07-21 12:28:16,794 [http-bio-80-exec-7] ERROR util.JDBCExceptionReporter  - Already closed.
2013-07-21 12:28:16,794 [http-bio-80-exec-7] ERROR util.JDBCExceptionReporter  - Already closed.
2013-07-21 12:28:16,807 [http-bio-80-exec-7] ERROR servlet.GrailsDispatcherServlet  - HandlerInterceptor.afterCompletion threw exception
org.hibernate.exception.GenericJDBCException: Cannot release connection
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:722)
Caused by: java.sql.SQLException: Already closed.
at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)
at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
... 7 more

The reason was the database connections in the pool was not used for some time and the connection got closed, and when the application tries to use that it was throwing the exception.

The solution worked to me is

Just added 3 properties into my DataSource.groovy file as follows,

dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:mysql://localhost/mydb?useUnicode=yes&characterEncoding=UTF-8"
username = "root"
password = "pwd"
properties {
        validationQuery = "select 1"
        testWhileIdle = true
        testOnBorrow = true

 }

you can find more information on this properties at http://commons.apache.org/proper/commons-dbcp/configuration.html

One more reason for the same problem could be double pooling, if you have configured your connection from application server (JNDI), please ensure you are not pooling the connections both in application server and grails application. Just remove one of the pooling to solve the issue.


Monday, 15 July 2013

JDoodle.com - Online Java Compiler - Online Java Editor - Java Code Online

As a java developer I often wanted to execute a small piece of code and test it quickly without opening an IDE. Some times the same bit of code we want to execute often and use the result somewhere. May be even we want to share that bit of joy with others. One of the solutions is JDoodle.com.

JDoodle.com helps compile and execute java programs online.  It has simple interface, give a try, if found useful share with friends. Share your thoughts about JDoodle.com here in comment.

Try some default shares

Hello World
Hello World with method
Sample with import and Input Arguments

some of the features you may like is

1. auto complete import - just type the class name it will come with whole bunch of suggestions for you, just select the one you want and click Tick button.

2. Recents - you can see all the recently executed codes in the browser here. even you can ask JDoodle to remember this between same browsers different session.

3. Share - makes sharing easier. Not all your code shared by default, so you can always control what to share and what not to.

Wednesday, 7 November 2012

Customizing Liferay Classes using ext plugin in 6.1

Liferay is highly flexible that developers can override any Liferay class by just replacing them in Ext Plugin. But overriding is not a very good action considering "Open for extension closed for Modification" Principle. 
so in this blog post I am going to show simple steps how to extend a Liferay class. 

Note: use ext plugin  class extension or replacement as a last resort if and only if the same cannot be achieved through hooks or other ways.

Step 1: Create you class by extending the Liferay class.
Step 2: Create a file called ext-spring in folder docroot/WEB-INF/ext-impl/src/META-INF
Step 3: From Liferay source code get the file portal-impl/src/META-INF/portal-spring.xml
Step 4: just copy the bean class you are extending from portal-spring.xml and paste to your ext-spring.xml, change the class name to your new extended class. (please ensure you have the <beans> outer tag too in ext-spring as in portal-spring)
step 5: deploy your ext, now Liferay will call your class instead of its own implementation.

Monday, 5 November 2012

Adding JQuery Library to Liferay 6.1 at Portal level

As all Liferay developers know, Liferay 5.2.x and earlier had included jQuery library by default at Portal level, so if we want to use jQuery in any portlet or plugins, we do not need to include the library. But from 6.0, Liferay is using YUI, so jQuery is not available by default and we need to include the jQuery library if we want to use.

The following blog entry from Liferay covers three different ways to include jQuery

http://www.liferay.com/web/nathan.cavanaugh/blog/-/blogs/5363997

1. Theme Level
2. Portlet Level
3. jsp level.

but I came across one scenario where we wanted to have the same behavior as in 5.2.3, we have multiple themes so we do not want to duplicate same code in every portlet, and want to include the jQuery at portal level..

The solution worked for us is

Step 1: included the jquery-1.2.6.min.js in your hook - /jsp-hook/docroot/WEB-INF/ext-web/docroot/html/js/jquery-1.2.6.min.js


Step 2: copy top_js.jspf from source and place that in your hook -  /jsp-hook/docroot/META-INF/custom_jsps/html/common/themes/ and add the the line

            <script src="/html/js/jquery-1.2.6.min.js"></script>

at the end of top_js.jspf.

so now jQuery available throughout the portal in all the themes. 

Monday, 3 September 2012

Is Chrome more secure than other Browsers in XSS attacks

I come across one interesting thing today, looks like Chrome and Safari are more advanced in preventing XSS attacks  than other browsers. To check this, write a small submit form as  below

Test1.jsp

 <body>  
  <form method="get" action="test2.jsp">  
      Attack using this box : <input type="text" name="attack"/>  
      <input type="submit"/>  
  </form>  
 </body>  

and a page to handle the submit

Test2.jsp

 <%=request.getParameter("attack")%>  

open the first one in a browser --> enter "<script> alert('hi......'); </script>" in the text box --> submit.

IE, Firefox, Opera - will show you an alert box with message "hi......"
Chrome and Safari - will not show anything but a blank screen.

In Chrome Console you can see the below error,

Refused to execute a JavaScript script. Source code of script found within request.

chrome detects the same source code in request and response and prevents the XSS attack. Same for Post method too.

Wednesday, 16 May 2012

adding set methods in JAXB for collections

Normally the JAXB generated classes will not contain set methods for collections. (The idea here is to access collections only using get as the basis assumption is the change only happens to the contents of the collection).

if you use the maven maven-jaxb2-plugin, then you can use collection-setter-injector plugin along with jaxb2 plugin to create set methods. Below is a sample configuration,


<plugin>

<groupId>org.jvnet.jaxb2.maven2</groupId>

<artifactId>maven-jaxb2-plugin</artifactId>

<executions>

<execution>

<goals>

<goal>generate</goal>

</goals>

<phase>generate-sources</phase>

</execution>

</executions>

<configuration>

<!-- This helps generate setter methods-->

<args>

<arg>-npa</arg>

<arg>-Xcollection-setter-injector</arg>

</args>

<extension>true</extension>

<episode>true</episode>

<plugins>

<!-- plugin to generate setter for collection-->

<plugin>

<groupId>net.java.dev.vcc.thirdparty</groupId>

<artifactId>collection-setter-injector</artifactId>

<version>0.5.0-1</version>

</plugin>

</plugins>          

</configuration>

</plugin>

Thursday, 12 April 2012

adding a new column as primary key in existing table

Today I come across a little tricky situation to add new column to existing table and make it as a primary key in MS SQL server, the solution is luckily simple,


 alter table my_table add [my_new_id] [int] IDENTITY(1,1);  
 alter table my_table add constraint pk_my_id primary key(my_new_id);  


if you already have a primary key, just remove that and add this new primary key.

Wednesday, 11 April 2012

Running Multiple SoapUI Mock Services from single Maven pom


Sometimes we may need to run multiple SoapUI mock services as part of Test cases, usually if we start multiple mock services from SoapUI, all will start in the same port, but for some reason it is not supported when we start as part of maven execution. Below is the pom entry which is used to start two or more mock services in different ports.

<plugin>
        <groupId>eviware</groupId>
          <artifactId>maven-soapui-plugin</artifactId>         
          <executions>
            <execution>
              <id>soapui-test1</id>
              <phase>test</phase>
              <goals>
                <goal>mock</goal>
              </goals>
              <configuration>            
                   <projectFile>target/mock-project1.xml</projectFile>
                   <port>8088</port>
                   <noBlock>true</noBlock>
                 </configuration>
            </execution>
            <execution>
              <id>soapui-test2</id>
              <phase>test</phase>
              <goals>
                <goal>mock</goal>
              </goals>
             <configuration>           
                   <projectFile>target/mock-project2.xml</projectFile>
                   <port>8089</port>
                   <noBlock>true</noBlock>
                 </configuration>             
            </execution>
          </executions>
        </plugin>

Monday, 9 April 2012

Secure your web apps with HDIV


Recently integrated hdiv framework into the web application I am working on.

We had already had taken enough safety measures to secure the web application, like

1. Always encoding the outputs (like always output from jsp using <C:out> with xml encoding instead of just printing them)
2. Code to secure against SQL injections
3. etc. 

But HDIV is an interesting framework, it seamlessly integrates with the existing application, no need to change the existing code (most of the time) and secures web application mainly against following attacks.

1. Cross site Scripting
2. SQL Injections
3. URL Tampering (I really like this protection, IMO only the links in the web site should be used for navigation, user should not be able to change the URL, especially the values in the path to navigate)
4. Spring bean auto binding, etc.

There are good documents about HDIV in its website hdiv.org, but did found much documentation about its integration with existing applications. So decided to explore my self and found an interesting example implementation at https://github.com/hdiv/hdiv-spring-mvc-showcase, downloaded that and explored, it is really awesome. So I am documenting some simple steps to integrate hdiv with your existing spring application.

Step 1: Dependencies

Include following dependencies in your project, for maven,

        <dependency>
                 <groupId>org.hdiv</groupId>
                   <artifactId>hdiv-core</artifactId>
                   <version>2.1.1</version>
          </dependency>
          <dependency>
                   <groupId>org.hdiv</groupId>
               <artifactId>hdiv-config</artifactId>
               <version>2.1.1</version>
          </dependency>
          <dependency>
                   <groupId>org.hdiv</groupId>
                   <artifactId>hdiv-spring-mvc</artifactId>
                   <version>2.1.1</version>
          </dependency>
          <dependency>
                   <groupId>org.hdiv</groupId>
                <artifactId>hdiv-jstl-taglibs-1.2</artifactId>
                 <version>2.1.1</version>
         </dependency>

Step 2: HDIV-Config.xml

Copy hdiv-config.xml to your resource folder(alternatively classpath, sample found in the showcase app)
see details about hdiv-config at bottom of this post.

Step 3:  web.xml Changes
Step 3.1

Include hdiv-config.xml in context config location as

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
               classpath:/spring-context.xml
               classpath:/hdiv-config.xml
        </param-value>
    </context-param>

Step 3.2

include following hdiv specific entries as,

    <!-- HDIV Init Listener -->
    <listener>
        <listener-class>org.hdiv.listener.InitListener</listener-class>
    </listener>
    <!-- HDIV Validator Filter -->
    <filter>
        <filter-name>ValidatorFilter</filter-name>
        <filter-class>org.hdiv.filter.ValidatorFilter</filter-class>
     </filter>
     <filter-mapping>
        <filter-name>ValidatorFilter</filter-name>
        <servlet-name>dispatcher</servlet-name>
     </filter-mapping>

here dispatcher is the nothing but spring dispatcher servlet, example

    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    </servlet>

Step 3.3

 point JSTL to hdiv customized JSTL tag library.

    <jsp-config>
        <taglib>
           <taglib-uri>http://java.sun.com/jsp/jstl/core</taglib-uri>
           <taglib-location>/WEB-INF/tlds/hdiv-c.tld</taglib-location>
        </taglib>
    </jsp-config>                    


Step 4: copy hdiv-c.tld to web-inf

copy the hdiv-c.tld from sample app to web-inf/tlds folder

Step 5: Create your initial landing page

HDIV protected site always expects an HDIV state code to validate the page, if you are trying to access any page without hdiv state it will redirect you to the error page, so we have to create some initial landing page which redirect to other page with hdiv state, following is an sample jsp for initial landing page

name: index.jsp

<body>
        <c:redirect url="login/login.html"></c:redirect>
</body> 
</html> 

include this file in welcome pages list in web.xml and place it in the root folder and add the root folder as starting pages folder in hdiv-config.xml, example 

<hdiv:config errorPage="/error.jsp">
    <hdiv:startPages>/</hdiv:startPages>
     <hdiv:paramsWithoutValidation>
          <hdiv:mapping url="/job/[0-9]*/.*/update.ht"  parameters=".*"/>
     </hdiv:paramsWithoutValidation>         
</hdiv:config>

All the files in the root folder(/) is considered as landing or starting page, so will be exampted from validation for hdiv state.

Important points:

1. Spring tags 3.0 and later has build in support for hdiv, so they can be simple used along with hdiv, but to use previous versions of spring tags, you may need to point your tlds to customized spring tlds, please refer the hdiv document for more details.

2. When using along with spring security or other frameworks which intercept the request and redirects to different pages, special care should be given otherwise it will end up in indefinite redirection loops. I had spring security in the project, so moved all the spring security related files(login, logout, etc) to different path which will not be intercepted by hdiv for more clarity. 

3. whenever accessing hdiv protected paths from non protected paths always use redirects as mentioned in the landing pages step above.


Some Points on hdiv-config.xml

There are three main sections in this file

1. <hdiv:config> section, which is  used to configure the start pages path, error page and validation exceptions 

2. <hdiv:validation> section, which is used to define the acceptable input formats 

3. <hdiv:editableValidations> section, which is used to associate the validations defined in <hdiv:validation> section with paths.

HDIV is really an added protection to the sites, developers may miss few things when protecting the site. By using a framework like HDIV, developers can concentrate more on building the logic than protecting each and every page. 

Give a try, post comment on how you go....






Monday, 19 March 2012

Maven Shortcuts

Maven is cool, but repeatably typing the long maven commands is little bit boring and waste of time. one simple solution is to create set of batch files for the repeatably used commands.

Most of us use our own set of batch files, I thought of organizing them in single place (atleast for me whenever I move to new project I don't need to create my own batch files again and again). I have created a project in github for this purpose and have included very minimum number of very frequently used commands.

The project located at https://github.com/nutpan/Maven-Shortcuts

you can download that and place it your classpath to save your time with maven commands.

Purposefully I have kept the number of commands as minimum, please send me your frequently used commands by raising a issue at https://github.com/nutpan/Maven-Shortcuts/issues or by adding a comment here, I would like to grow the collection in this way on need basis, so that it will have only the most wanted comments.

Below are the shortcuts and their actual maven command


mvnc - mvn clean
mvni - mvn install

mvnci - mvn clean install
mvnciwt - mvn clean install with out tests
mvnt - mvn test
mvnt %1 - mvn test on single test file (eg : mvnt MyTest)
mvnee - mvn eclipse:eclipse


For Windows, copy all the batch files in to a folder and add the folder in classpath
For linux/unix, you can copy the sh files into bin folder and give executable permission using commands in makeItExec.sh

Sunday, 18 March 2012

Liquibase Maven Plugin - Issue with non local database

There is an option in Liquibase to prompt for permission if the database it connects to is not in local system.
By default this option is turned off as per the Liquibase documentation, but when execute through maven Liquibase plugin seems like this default is other way round and by default it is true and even if add the property

promptOnNonLocalDatabase=false


to liquibase properties file, it is not changing its behavior, when we execute this in non head environments like unix, it does through following exception


No X11 DISPLAY variable WAS set, this program aims Performed year operation Which
Requires it.
at java.awt.GraphicsEnvironment.checkHeadless (GraphicsEnvironment.java: 159)
at java.awt.Window.(Window.java: 407)
at java.awt.Frame.(Frame.java: 402)
at java.awt.Frame.(Frame.java: 367)
at $ javax.swing.SwingUtilities SharedOwnerFrame.(SwingUtilities.java: 1731)
at javax.swing.SwingUtilities.getSharedOwnerFrame (SwingUtilities.java: 1808)
at javax.swing.JOptionPane.getRootFrame (JOptionPane.java: 1673)
at javax.swing.JOptionPane.showOptionDialog (JOptionPane.java: 846)
at javax.swing.JOptionPane.showConfirmDialog (JOptionPane.java: 779)
at javax.swing.JOptionPane.showConfirmDialog (JOptionPane.java: 741)
at liquibase.SwingUIFacade.promptForNonLocalDatabase (SwingUIFacade.java: 15)



Solution to this problem is ,


Just add the following in to the maven plugin configuration section

  <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>

Example :


<build>
      <plugins>
        <plugin>
          <groupId>org.liquibase</groupId>
          <artifactId>liquibase-maven-plugin</artifactId>
          <version>2.0.1</version>
          <executions>
            <execution>
              <phase>process-resources</phase>
              <configuration>
                <propertyFile>target/classes/liquibase.properties</propertyFile>
                <promptOnNonLocalDatabase>false</promptOnNonLocalDatabase>
              </configuration>
              <goals>
                <goal>update</goal>
              </goals>
            </execution>
          </executions>
        </plugin>
      </plugins>
    </build>

Hope this helps....