Heroku Adds Java Support

Today Heroku announced that Java is now supported on the Heroku Cloud Application Platform! This is incredibly exciting news and I’m very lucky to be a Heroku for Java Developer Evangelist!

Joining salesforce.com and jumping into the the Java Cloud space holds some nostalgia for me. When I began using Java in 1997 I was working at an ISP in Denver. We did the regular web hosting thing, but when the first Java Servlet engines (like Java Web Server 1.0) came out, I created the “wantjava.com” hosting service. Things were really nasty at first. We could only run one instance of the JWS on a server so I came up with a really bad way to do “multi-tenancy”. I setup a cron job to rsync the customers’ .class files into the server’s webapp and then restart the server. Customers had to email me to get a servlet added to the web.xml file. Uggg… I feel like I need to go to confession for this. But it worked and as the Servlet containers improved we quickly migrated to a more sustainable model.

Now thirteen years later I am privileged to once again be part of Java on the Cloud. But this time around things are so much easier, better, and sexier! Heroku is a leading the way in a new generation of application deployment that is making things much better for us Java developers.

What is Heroku?

Shortly I will dive into how you can run Java on Heroku, but first, what is Heroku? From my perspective, Heroku is a Polyglot Cloud Application Platform. Heroku provides us a way to run Ruby, Node.js, Clojure, and Java applications on a managed, scalable, and multi-tenant system. Heroku also provides numerous add-ons that help us make the shift from monolithic middleware to Cloud Components. Another way to say it is:

** Heroku = Polyglot + Platform as a Service (PaaS) + Cloud Components **

It is very exciting to see these three things coming together! With Polyglot I can choose the right tool for the job. With PaaS I don’t have to think about managing operating systems, scalability, failover, etc. And with the Cloud Component Architecture I can keep my app thin and focused on what is unique to the problem it needs to solve. Heroku brings these models together as a cloud application platform.

Running Java Apps on Heroku

Heroku can run any Java app that runs in OpenJDK 6. Today Heroku uses Maven to create a “slug” for Java apps. That slug can then be loaded onto one or more “dynos". You can tell a dyno to execute / start a Java app from the command line and you can also use a “Procfile” to provide a command that will auto-start for each instance of a specific dyno type. Web dynos are able to listen on a port and will receive HTTP traffic through a load balancer that is automatically setup for each app. With that background knowledge, lets dive into code!

For Dreamforce 2011, I (with the help of a few co-workers) put together a Heroku for Java Workbook. The Workbook provides detailed instructions on how to create web apps, connect to a database, setup worker processes, use the Redis to Go Heroku add-on, and use Spring Roo on Heroku. But if you are anxious to get started and don’t need as much hand-holding, here is a quick and very simple walk through of how to run Java on Heroku:

  1. Install the heroku command line client on Linux, Mac, or Windows.

  2. Install git and setup your ssh key

  3. Install Maven

  4. Login to Heroku from the command line: bash heroku auth:login

  5. Create a new project directory and move into it: bash mkdir helloherokujava cd helloherokujava

  6. Create a Maven build file named pom.xml containing: xml <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>foo</groupId> <version>1.0-SNAPSHOT</version> <name>helloherokujava</name> <artifactId>helloherokujava</artifactId> </project>

  7. Create a Java source directory: bash mkdir -p src/main/java

  8. Create a new Java class in the src/main/java directory named Hello.java containing: java public class Hello { public static void main(String[] args) { System.out.println("hello, world"); } }

  9. Compile the class: bash mvn compile

  10. Run the class locally: bash java -cp target/classes Hello

  11. Create a local git repo, add the pom.xml file & src dir, and commit the files: bash git init git add pom.xml src git commit -m init

  12. Create a new app on Heroku using the Cedar stack: bash heroku create -s cedar

  13. Upload your app to Heroku: bash git push heroku master

Heroku will create a slug for your app.

* Run the app on Heroku:
heroku run "java -cp target/classes Hello"
    Heroku will start a new dyno with your slug and then run the specified command.
    You just ran Java on the cloud! Obviously this is a very simple example. But I like to start new things with the simplest thing that could possibly work. Now that you have that working there is more to learn and much more power to harness!
    ## Next Steps
      * Go through the [Heroku for Java Workbook][8] 
      * Go through the articles on the [Heroku Dev Center][14] 
      * Ask questions about Heroku on [StackOverflow][15] 
      * Keep watching here for many more blogs about Java on Heroku
    Have fun and please let me know if you have any questions about Heroku.