Today when I fired Spring Roo shell I started getting exception as shown below and I was not able to execute any command. I uninstalled Spring Roo (thinking that it might have got corrupted) but it didn’t helped after lot of firefighting I figured out the solution to overcome this problem. The problem was that yesterday I trusted some pgp keys and somehow Roo was not able to find them and started throwing exception. The solution is to remove a file name .spring_roo_pgp.bpg and restart Spring Roo. Spring Roo will create a new clean file. Continue reading “Spring Roo PGP Exception”
Author: shekhargulati
Logging JAXWS SOAP Request and Response using a Java Property
Today I was faced with the situation that I needed to log the SOAP requests and responses going in and out from a Java client. I just had the client jar no source code so I can’t any any log or change any other configuration. I needed to log the request and response because I was getting some weird exceptions which I was not able to understand. I got the hold of the SOAP request by passing a Java property
java -Dcom.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump=true -jar client.jar
Writing to OpenShift Express File System
One of the features that you will not find in most Platform as a Service solutions is writing to file system. Writing to file system is very important as you need it in case you want to write user uploaded content to file system, or write lucene index or read some configuration file from a directory. OpenShift Express from the start support writing to file system.
In this blog I will create a simple Spring MVC MongoDB application which store movie documents. I will be using Spring Roo to quickly scaffold the application. Spring Roo does not provide file upload functionality so I will modify the default application to add that support. Then I will deploy the application to OpenShift Express.
Creating a OpenShift Express JBoss AS7 application
The first step is to create the JBoss AS7 applictaion in OpenShift Express. To do that type the command as shown below. I am assuming you have OpenShift Express Ruby gem installed on your machine.
rhc-create-app -l <rhlogin email> -a movieshop -t jbossas-7.0 -d
This will create a sample Java web application which you can view at http://movieshop-<namespace>.rhcloud.com.
Adding support for MongoDB Cartridge
As we are creating Spring MongoDB application we should add support for MongoDB by executing the command as shown below.
rhc-ctl-app -l <rhlogin email> -a movieshop -e add-mongodb-2.0 -d
Removing default generated file from git
We don’t need the default generated files so remove them by executing following commands.
git rm -rf src pom.xml git commit -a -m "removed default generated files"
Creating Spring MVC MongoDB MovieShop Application
Fire the Roo shell and execute the following commands to create the application.
project --topLevelPackage com.xebia.movieshop --projectName movieshop --java 6 mongo setup entity mongo --class ~.domain.Movie repository mongo --interface ~.repository.MovieRepository service --interface ~.service.MovieService field string --fieldName title --notNull field string --fieldName description --notNull --sizeMax 4000 field string --fieldName stars --notNull field string --fieldName director --notNull web mvc setup web mvc all --package ~.web
Adding file upload support
Add two fields to Movie entity as shown below.
@Transient
private CommonsMultipartFile file;
private String fileName;
public CommonsMultipartFile getFile() {
return this.file;
}
public void setFile(CommonsMultipartFile file) {
this.file = file;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
Edit the create.jspx file as shown below to add file upload as shown below.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:c="http://java.sun.com/jsp/jstl/core" xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields" xmlns:form="urn:jsptagdir:/WEB-INF/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:spring="http://www.springframework.org/tags" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8"/>
<jsp:output omit-xml-declaration="yes"/>
<form:create id="fc_com_xebia_movieshop_domain_Movie" modelAttribute="movie" path="/movies" render="${empty dependencies}" z="wysyQcUIaJOAUzNYNVt5nMEdvHk=" multipart="true">
<field:input field="title" id="c_com_xebia_movieshop_domain_Movie_title" required="true" z="SpYrTojoyx2F7X5CjEfFQ6CBdA4="/>
<field:textarea field="description" id="c_com_xebia_movieshop_domain_Movie_description" required="true" z="vxiB62k7E7FzhnVz1kU7CCIYEkw="/>
<field:input field="stars" id="c_com_xebia_movieshop_domain_Movie_stars" required="true" z="XdvY0mpBitMGzrARD3TmTxxXZHg="/>
<field:input field="director" id="c_com_xebia_movieshop_domain_Movie_director" required="true" z="6L8yvzx1cZgTq0QKP1dHbGHbQxI="/>
<field:input field="file" id="c_com_shekhar_movieshop_domain_Movie_file" label="Upload image" type="file" z="user-managed"/>
<field:input field="fileName" id="c_com_xebia_movieshop_domain_Movie_fileName" z="user-managed" render="false"/>
</form:create>
<form:dependency dependencies="${dependencies}" id="d_com_xebia_movieshop_domain_Movie" render="${not empty dependencies}" z="nyAj+bBGTpzOr2SwafD6lx7vi30="/>
</div>
Also change the input.tagx file to add support for input type file. Add the following line as shown below
<c:when test="${type eq 'file'}">
<form:input id="_${sec_field}_id" path="${sec_field}" disabled="${disabled}" type="file"/>
</c:when>
Modify the MovieController to write file either to the OpenShift_DATA_DIR or my local machine in case System.getEnv(“OPENSHIFT_DATA_DIR”) is null. The code is shown below.
import java.io.File;
import java.io.FileInputStream;
import java.io.UnsupportedEncodingException;
import java.math.BigInteger;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.roo.addon.web.mvc.controller.scaffold.RooWebScaffold;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.springframework.web.util.UriUtils;
import org.springframework.web.util.WebUtils;
import com.xebia.movieshop.domain.Movie;
import com.xebia.movieshop.service.MovieService;
@RequestMapping("/movies")
@Controller
@RooWebScaffold(path = "movies", formBackingObject = Movie.class)
public class MovieController {
private static final String STORAGE_PATH = System.getEnv("OPENSHIFT_DATA_DIR") == null ? "/home/shekhar/tmp/" : System.getEnv("OPENSHIFT_DATA_DIR");
@Autowired
MovieService movieService;
@RequestMapping(method = RequestMethod.POST, produces = "text/html")
public String create(@Valid Movie movie, BindingResult bindingResult,
Model uiModel, HttpServletRequest httpServletRequest) {
if (bindingResult.hasErrors()) {
populateEditForm(uiModel, movie);
return "movies/create";
}
CommonsMultipartFile multipartFile = movie.getFile();
String orgName = multipartFile.getOriginalFilename();
uiModel.asMap().clear();
System.out.println(orgName);
String[] split = orgName.split("\\.");
movie.setFileName(split[0]);
movie.setFile(null);
movieService.saveMovie(movie);
String filePath = STORAGE_PATH + orgName;
File dest = new File(filePath);
try {
multipartFile.transferTo(dest);
} catch (Exception e) {
throw new RuntimeException(e);
}
return "redirect:/movies/"
+ encodeUrlPathSegment(movie.getId().toString(),
httpServletRequest);
}
@RequestMapping(value = "/image/{fileName}", method = RequestMethod.GET)
public void getImage(@PathVariable String fileName, HttpServletRequest req, HttpServletResponse res) throws Exception{
File file = new File(STORAGE_PATH+fileName+".jpg");
res.setHeader("Cache-Control", "no-store");
res.setHeader("Pragma", "no-cache");
res.setDateHeader("Expires", 0);
res.setContentType("image/jpg");
ServletOutputStream ostream = res.getOutputStream();
IOUtils.copy(new FileInputStream(file), ostream);
ostream.flush();
ostream.close();
}
Also change the show.jspx file to display the image.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<div xmlns:field="urn:jsptagdir:/WEB-INF/tags/form/fields" xmlns:jsp="http://java.sun.com/JSP/Page" xmlns:page="urn:jsptagdir:/WEB-INF/tags/form" version="2.0">
<jsp:directive.page contentType="text/html;charset=UTF-8"/>
<jsp:output omit-xml-declaration="yes"/>
<page:show id="ps_com_xebia_movieshop_domain_Movie" object="${movie}" path="/movies" z="2GhOPmD72lRGGsTvy9DYx8/b/b4=">
<field:display field="title" id="s_com_xebia_movieshop_domain_Movie_title" object="${movie}" z="L3rzNq9mt4vOBL/2S9L5XTn4pGA="/>
<field:display field="description" id="s_com_xebia_movieshop_domain_Movie_description" object="${movie}" z="rctpFQukL584DSNTEhcZ/zqm19U="/>
<field:display field="stars" id="s_com_xebia_movieshop_domain_Movie_stars" object="${movie}" z="Mi3QNsQkI5hqOVW44XwXAGF2zKE="/>
<field:display field="director" id="s_com_xebia_movieshop_domain_Movie_director" object="${movie}" z="rhXx3l+3zMxx0O0ht2Td3Icx1ZE="/>
<field:display field="fileName" id="s_com_xebia_movieshop_domain_Movie_fileName" object="${movie}" z="7XTMedYLsWVvZkq2fKT0EZpZaPE="/>
<IMG alt="${movie.fileName}" src="/movieshop/movies/image/${movie.fileName}" />
</page:show>
</div>
Finally change the webmvc-config.xml to have CommonsMultipartResolver bean as shown below.
<bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver" > <property name="maxUploadSize" value="100000"></property> </bean>
Pointing to OpenShift MongoDB datastore
Change the applicationContext-mongo.xml to point to OpenShift MongoDB instance as shown below.
<mongo:db-factory dbname="${mongo.name}" host="${OPENSHIFT_NOSQL_DB_HOST}"
port="${OPENSHIFT_NOSQL_DB_PORT}" username="${OPENSHIFT_NOSQL_DB_USERNAME}"
password="${OPENSHIFT_NOSQL_DB_PASSWORD}" />
Add OpenShift Maven Profile
OpenShift applications require maven profile called openshift which is executed when git push is done.
<profiles> <profile> <!-- When built in OpenShift the 'openshift' profile will be used when invoking mvn. --> <!-- Use this profile for any OpenShift specific customization your app will need. --> <!-- By default that is to put the resulting archive into the 'deployments' folder. --> <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --> <id>openshift</id> <build> <finalName>movieshop</finalName> <plugins> <plugin> <artifactId>maven-war-plugin</artifactId> <version>2.1.1</version> <configuration> <outputDirectory>deployments</outputDirectory> <warName>ROOT</warName> </configuration> </plugin> </plugins> </build> </profile> </profiles>
Deploying Application to OpenShift
finally do git push to deploy the application to OpenShift and you can view the application running at http://movieshop-random.rhcloud.com/
Fixing Exception — Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)
If you are working with Spring Roo and suddenly start getting exception “Entity manager has not been injected (is the Spring Aspects JAR configured as an AJC/AJDT aspects library?)” then make sure you have _Configurable.aj ITD in your project. This ITD makes the sure that your entity classes have all the required dependencies like EntityManager injected in them. Configurable ITD looks like as shown below
privileged aspect Movie_Roo_Configurable {
declare @type: Movie: @Configurable;
}
How to rename field in all the MongoDB documents?
Today I was faced with a situation where in I need to rename a field in all the MongoDB documents. The best way to do this is using $rename operator shown below.
db.post.update ( {}, { $rename : { "creationDate" : "creationdate" }},false,true )
Here true corresponds to updating all the all the documents i.e. multi is true.
From MongoDB documentation. Here’s the MongoDB shell syntax for update():
db.collection.update( criteria, objNew, upsert, multi )
Arguments:
- criteria – query which selects the record to update;
- objNew – updated object or $ operators (e.g., $inc) which manipulate the object
- upsert – if this should be an “upsert” operation; that is, if the record(s) do not exist, insert one. Upsert only inserts a single document.
- multi – indicates if all documents matching criteria should be updated rather than just one. Can be useful with the $ operators below.
Accessing PostgreSQL Server From Remote Machine
Today I was trying to remotely connect to PostgreSQL server and it took me some time to configure it. So, in this short blog I am sharing the procedure to make it work.
- Edit the pg_hba.conf file to enable client connections as shown below. The important thing is the use of 0.0.0.0/0 to allow client access from any IP address. You can also define a subset of ip here.
# TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust host all all 0.0.0.0/0 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. #local replication postgres md5 host replication postgres 0.0.0.0/0 trust host replication postgres ::1/128 trust
- Edit the postgresql.conf file and change listen_addresses = ‘*’ . This means any client can access the server. By default value is local. You can also specify a comma separated list of ip address also.
- Restart the postgreSQL server either using postgres service or first killing the process and then starting using pg_ctl script.
- The last and most important thing is to edit the /etc/sysconfig/iptables file and add entry to allow access to 5432 port. This can be done as shown below. Please add the line shown below in iptables file.
-A INPUT -m state –state NEW -m tcp -p tcp –dport 5432 -j ACCEPT - Then restart the iptables service using service iptables restart
- Finally test it with psql client by executing following command ./psql -U postgres -h 192.168.0.10 -p 5432
Spring Roo + OpenShift Express == Extreme Productivity In Cloud Part 1
Today, I released the second version of OpenShift Express Spring Roo Add-on. With this release add-on also support creation of domain namespace and changing the domain namespace. Now the only important thing left in the add-on is support for session management so that users does not have to enter email and password with every command. From today, I am starting a series of short blog posts which will cover the features of this add-on. In this post I will be talking about creating and changing domain namespace. Before I get into details lets me first tell you what is Spring Roo and OpenShift Express in case you don’t know about them.
Note :You can also refer to my Spring Roo series on IBM DeveloperWorks for more details.
What is Spring Roo?
Spring Roo is a lightweight productivity tool for Java™ technology that makes it fast and easy to develop Spring-based applications. Applications created using Spring Roo follow Spring best practices and are based on standards such as JPA, Bean Validation (JSR-303), and Dependency Injection (JSR-330). Roo offers a usable, context-aware, tab-completing shell for building applications. Spring Roo is extensible and allows add-ons, enhancing its capability.
What is OpenShift Express?
OpenShift Express is a Platform as a Service offering from RedHat. OpenShift Express allows you to create and deploy applications to the cloud. The OpenShift Express client is a command line tool that allows you to manage your applications in the cloud. It is currently free and runs on Amazon EC2. Currently it supports Java, Ruby, PHP, Python run times. You can refer to OpenShift Express documentation for more details.
OpenShift Express Client Tools
OpenShift Express has three client tools for creating and deploying applications to cloud. These are RHC Ruby Gem., OpenShift Express Eclipse Plugin, and SeamForge RHC Plugin. I have mainly used RHC Ruby Gem and it is very easy to use and work. There were two problems why I decided to write Roo add-on. One is that you need Ruby Runtime and second is I use Spring Roo a lot so it allows me to perform full lifecycle of the application from within Roo shell. Because I am writing add-on I can also do lot of interesting stuff like session management, making some changes to the code to avoid repetitive work. One such thing that I have already added is adding OpenShift profile in the pom.xml. This will help me automate repetitive work.
Lets Get Started
Getting started with the add-on is very easy. First you need to download Spring Roo and fire the Roo shell. Once inside the Roo shell we have to install the add-on. To do this execute the following command as shown below.
osgi start --url http://spring-roo-openshift-express-addon.googlecode.com/files/org.xebia.roo.addon.openshift-0.2.RELEASE.jar
It will take couple of seconds to install the add-on. You can view that a new OSGI process has started using osgi ps command.
Creating Domain
Before you can create domain please signup at https://openshift.redhat.com/app/express. The email and password with which you signup will be the credentials for accessing the cloud. After you have signed up the next step is to create a domain. You can’t create the applications before creating a domain. The domain is a logical name within which all your applications will reside. It forms the part of your application url. For example if you created a domain with name “paas” and application with name “openshift” your application url will be http://openshift-paas.rhcloud.com . We can create the domain using rhc-create-domain command but in this blog I will show you how to create using Spring Roo add-on. To create domain using Spring Roo execute the command shown below.
rhc create domain --namespace openpaas --rhLogin <rhlogin> --password <password> --passPhrase <passphrase>
This command does the following things :
- It will create the ssh keys under user.home/.ssh folder if they does not exist. The passphrase is required for creating the sshkeys.
- If ssh keys already exists it loads the ssh keys from user.home/.ssh location and reuse them.
- finally it creates the domain with namespace openpaas.
- In case your credentials are wrong it will show a log line saying that credentials are wrong.
Changing Domain Namespace
Although you can’t delete a domain after you have created but you can change the domain name. To do that you can use the command shown below.
rhc change domain --namespace xyz --rhLogin <rhlogin> --password <password>
This will change the domain name to xyz.
Thats it for this blog. In the next blog we will look at how to create Spring JPA application using Spring Roo and deploy it to OpenShift Express.
Spring Roo Add-on Release Problems
I am writing a add-on for deploying Spring Roo applications to OpenShift Express cloud just like the Cloud Foundry Spring Roo add-on. The add-on is available at http://code.google.com/p/spring-roo-openshift-express-addon/. But I face problems when I release the add-on using Maven Release plugin (mvn release:prepare release:perform). So, this is simple guide to help me next time I face these issues.
- SnapShot Dependencies : The first problem I face is that my add-on depend on OpenShift Java client which is available as Snapshot dependency. So, I need to ignore the snapshot dependencies. This is not recommeded but some times you don’t have any other solution. For more information refer to this post http://stackoverflow.com/questions/245932/how-to-release-a-project-which-depends-on-a-3rd-party-snapshot-project-in-maven
mvn release:prepare release:perform -DignoreSnapshots=true
- Adding Third Party Jars in an OSGI bundle. I have blogged this at https://whyjava.wordpress.com/2012/01/02/adding-third-party-jars-to-an-osgi-bundle/.
- The third problem I face is that svn client is not able to authenticate with Google Code. The exception that I get is shown below. To fix this I specify username and password with mvn release command as shown below.
mvn release:prepare release:perform -DignoreSnapshots=true -Dusername=shekhar.xebia@gmail.com -Dpassword=password
The exception that I get is
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.2:prepare (default-cli) on project org.xebia.roo.addon.openshift: Unable to commit files [ERROR] Provider message: [ERROR] The svn command failed. [ERROR] Command output: [ERROR] svn: Commit failed (details follow): [ERROR] svn: MKACTIVITY of '/svn/!svn/act/b8000ba7-c3c6-4bb2-9d3b-bd3c1db73dd3': authorization failed: Could not authenticate to server: rejected Basic challenge (https://spring-roo-openshift-express-addon.googlecode.com) [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
Recover Lost Cartridge Password in OpenShift Express
I have been working with OpenShift express for quite some time and I create lot of applications and add different cartridge to the application. To access the cartridges using clients you need to remember the credentials. I developed a small application which was using MongoDB cartridge and I wanted to access the database using mongo shell client on the express instance but I forgot the password. To retrieve the lost password a simple recipe is to log into the express instance using ssh. Get the user information from rhc-user-info command. Once you log into instance just type env command. It will list down all the environment variable and from the list you can recover password. A sample output is shown below.
[example-example.rhcloud.com ~]\> env OPENSHIFT_NOSQL_DB_USERNAME=admin SELINUX_ROLE_REQUESTED= OPENSHIFT_NOSQL_DB_TYPE=mongodb TERM=xterm SHELL=/usr/bin/trap-user OPENSHIFT_LOG_DIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example/logs/ SSH_CLIENT=122.161.141.170 13010 22 OPENSHIFT_NOSQL_DB_URL=mongodb://admin:aCJ5muBZKtjw@127.1.40.1:27017/ OPENSHIFT_TMP_DIR=/tmp/ SELINUX_USE_CURRENT_RANGE= OPENSHIFT_REPO_DIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example/repo/ OPENSHIFT_HOMEDIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/ OPENSHIFT_INTERNAL_PORT=8080 SSH_TTY=/dev/pts/0 USER=2b80xxxxxxxxxxxxxxxx4547a74fb42b9 OPENSHIFT_NOSQL_DB_PASSWORD=aCJ5muBZKtjw TMOUT=300 OPENSHIFT_NOSQL_DB_MONGODB_20_RESTORE=/usr/libexec/li/cartridges/embedded/mongodb-2.0/info/bin/mongodb_restore.sh OPENSHIFT_NOSQL_DB_MONGODB_20_DUMP_CLEANUP=/usr/libexec/li/cartridges/embedded/mongodb-2.0/info/bin/mongodb_cleanup.sh PATH=/usr/libexec/li/cartridges/jbossas-7.0/info/bin/ OPENSHIFT_RUN_DIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example/run/ OPENSHIFT_NOSQL_DB_PORT=27017 OPENSHIFT_INTERNAL_IP=127.1.40.1 PWD=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9 OPENSHIFT_NOSQL_DB_MONGODB_20_EMBEDDED_TYPE=mongodb-2.0 JAVA_HOME=/etc/alternatives/java_sdk_1.6.0 OPENSHIFT_APP_DNS=example-example.rhcloud.com OPENSHIFT_NOSQL_DB_HOST=127.1.40.1 LANG=en_IN PS1=[example-example.rhcloud.com \W]\> OPENSHIFT_APP_CTL_SCRIPT=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example /example_ctl.sh JENKINS_URL=http://jenkins-sgulati.rhcloud.com/ SELINUX_LEVEL_REQUESTED= OPENSHIFT_APP_DIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example/ SHLVL=1 M2_HOME=/etc/alternatives/maven-3.0 HOME=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9 OPENSHIFT_APP_TYPE=jbossas-7.0 OPENSHIFT_APP_NAME=example OPENSHIFT_DATA_DIR=/var/lib/libra/2b80xxxxxxxxxxxxxxxx4547a74fb42b9/example/data/ LOGNAME=2b80xxxxxxxxxxxxxxxx4547a74fb42b9 SSH_CONNECTION=122.161.141.170 13010 10.211.147.239 22 OPENSHIFT_APP_UUID=2b80xxxxxxxxxxxxxxxx4547a74fb42b9 OPENSHIFT_NOSQL_DB_MONGODB_20_DUMP=/usr/libexec/li/cartridges/embedded/mongodb-2.0/info/bin/mongodb_dump.sh OPENSHIFT_NOSQL_DB_CTL_SCRIPT=/var/lib/libra//2b80xxxxxxxxxxxxxxxx4547a74fb42b9//mongodb-2.0//example_mongodb_ctl.sh _=/bin/env
Deploying Application To OpenShift Express using Spring Roo OpenShift Express Add-on
Last couple of years Spring Roo has been one of my favorite tool to rapidly build Spring applications for demo, POC, and learning new technologies. With Spring Roo Cloud Foundry integration you can not only build applications rapidly but deploy to Cloud Foundry public cloud with a couple of commands. In case you are not aware of Spring Roo and Cloud Foundry you can refer to my Spring Roo series on IBM DeveloperWorks. From last 5-6 months I have been following OpenShift platform as a service and I am really in love with OpenShift Express because of its feature set and simplicity. In case you are not aware of OpenShift Express please refer to the documentation. There are two ways Java applications can be deployed to express — using ruby command line tool called RHC and using Eclipse plugin. Personally I like rhc command line more than eclipse plugin. The rhc command line tool is great but you should have ruby runtime installed on your machine. Being Spring Roo afficianado I decided to write Spring Roo OpenShift Express add-on to create, deploy, add cartridges from with Roo shell. This can be thought of as a third way to deploy applications to OpenShift Express. The project is hosted on Google Code at http://code.google.com/p/spring-roo-openshift-express-addon/. In this blog I will show you how you can install the add-on, create a template OpenShift Express application, convert that application to a Spring MongoDB application using Spring Roo, and finally deploy application to OpenShift Express. You can read the full blog at my company blog http://xebee.xebia.in/2012/01/09/running-spring-java-mongodb-apps-on-openshift-express-using-spring-roo-openshift-express-addon/