Imagine a bacon-wrapped Ferrari. Still not better than our free technical reports.

JRebel rescues Oracle ATG Web Commerce users from Redeploy Madness

Introduction and a little history

You may remember that back in 1991, two MIT graduates set up an IT company called Art Technology Group (ATG), which grew into a successful provider of eCommerce and business applications before being acquired by Oracle for $1 billion in early 2011. The ATG Web Commerce framework is now under the Oracle umbrella, and it mostly used by large Enterprise providers to develop advanced eCommerce applications.

Because JRebel is an all-Java plugin (meaning that it will work, give some small integration effort, with anything on the JVM), some customers have tried to integrate JRebel with ATG out-of-the-box without knowing for sure what would happen. Although we already support 47 different web and server side frameworks, not all the changes a user makes to their code base will be supported without some tender love and care from our JRebel APIs team.

Out of the box, JRebel will reload code changes to class structures in ATG, but when making configuration changes, JRebel didn’t (until now!) support any ATG specific configuration re-initialization when the underlying classes were changed.

After some time, several larger clients let us know that is would be really quite cool if a service in ATG would be reloaded when the service’s Java class is changed. The services in ATG are something like Spring beans, configured by property files, consisting of multiple property files that define a service with a Java class. They can reference each other and initialize classes with properties, similarly to Spring beans.

And that’s how additional support for the thousands of Java technologies is born here at ZeroTurnaround – just ask us enough and we’ll jump on it.

So we went on and wrote an ATG integration that re-initializes the values of an ATG service when the backing Java class is changed, thus preventing Redeploy Madness among ATG users. The current version of JRebel has been tested with ATG10.1 and ATG 2007.4.

ATG you beast, how can I love you?

To integrate ATG with JRebel, we needed to get a simple, standalone ATG application working, but we didn’t want to install a big database server. For our needs, we only wanted it to simply run in order to understand the entire application.

But when we browsed the mighty internets, we didn’t find a good example. Yes, ATG has some examples with it, but they are big, really BIG. In addition to ATG, you must install a database server just to get a simple “Hello World!” application in the works.

Finally, we managed to strip an ATG application down to only a handful of files, which we could easily understand. Since we think we are getting paid to do this stuff (right, boss?), we figured that other users would be interested in grabbing an easily-understandable, stripped down version of a sample ATG application without having to go through all the documentation. So here it is…Introducing “Hello Rebel”, a simple ATG application…


These are the end goals of this how to:

  • Building a simple, standalone step-by-step ATG application (“Hello Rebel”).
  • Avoiding database installation – Use of an embedded database.
  • Using JRebel for reloading lots of changes on the fly, without restarting.
  • Finishing with a deployable ZIP that contains the demo application.

Note: We made a separate JRebel tutorial page for the actual how-to in case you want to see only the gritty tech of it all outside of the blog context, but the content is identical to what you see below, and here you can see comments as well.

Getting started

First you need to download the ATG framework from the You will need to create an user for the Oracle site and you must check the “Yes, I’d like to become a member of the Oracle Technology Network (OTN)” flag on your Oracle account page. Then you can download the ATG by:

Download » Applications » “E-Business Suite, PeopleSoft, JD Edwards, Siebel CRM” » ATG Web Commerce » Oracle ATG Web Commerce (10.1.1)

Here are a few more things that you’ll need for this tutorial before we get started:

  • Embedded database – HSQLDB (2.2.9)
  • For really fast development cycle – JRebel
  • You will also need an application server to run your application. We used WebLogic 10.3.5.

Installing the software

Because we want to concentrate more on writing the “Hello Rebel!” sample application, we will quickly fly over the preparations.

First you must install your application server. We used WebLogic 10.3.5. with the default values and “Typical” configuration and created a default domain with AdminServer. We had already installed JRebel, so we add the JVM arguments according to the manual.

After that you should install ATG. We used the default location and installed all the products; when it asked for the server we pointed it to the WLS we just installed.

Writing “Hello Rebel!”

Now to the fun part, writing the actual application! We start off by creating an empty directory atg-hello-demo under ATG home.

Next we create a simple application in that new folder.

  • Create a folder: atg-hello-demo\demo
  • Create a jsp: atg-hello-demo\demo\index.jsp
  • <%@ taglib uri="/dspTaglib" prefix="dsp" %>
    <dsp:droplet name="/test/TestService">

    will be the ATG Nucleus service we are using.

  • Create atg-hello-demo\demo\META-INF
  • Create atg-hello-demo\demo\META-INF\MANIFEST.MF
  • Manifest-Version: 1.0
    ATG-Module-Uri: demo.war
    ATG-Context-Root: demo
  • Create atg-hello-demo\demo\WEB-INF\web.xml
  • <?xml version="1.0" ?>
    <web-app xmlns="" xmlns:xsi=""
       xsi:schemaLocation="" version="2.5">
     <display-name>Demo Web Application</display-name>

    The NucleusServlet in the web.xml is important because it starts ATG.

  • Now we need to add taglibs for the JSP tags. The simplest way would be to copy them from another project: Copy the lib and taglibs directories from DCSSampleCatalog\j2ee-apps\sampleCatalog\web-app\WEB-INF to atg-hello-demo\demo\WEB-INF
  • Now we have the application ready and can start with the ATG configuration.

    Creating an ATG service for “World”

    Now we must make the “TestService” that we used in the JSP.

  • Create a folder: atg-hello-demo\services
  • Create a folder: atg-hello-demo\services\demo
  • Create a Java file: atg-hello-demo\services\demo\
  • package demo;
    import javax.servlet.*;
    import javax.servlet.http.*;
    import atg.servlet.*;
    public class TestService extends DynamoServlet {
     int age;
     public TestService () {
        System.out.println ("Constructing TestService");
     public void service (DynamoHttpServletRequest request, DynamoHttpServletResponse response) throws ServletException, IOException {
        System.out.println ("servicing TestService "+age);
        ServletOutputStream out = response.getOutputStream ();
        out.println ("World! My age is "+age);
     public int getAge () { return age; }
     public void setAge (int age) {
        System.out.println ("setting age of TestService to " + age);
        this.age = age;

    Click on the image to see the larger version so you don’t have to squint your eyes:

  • Create a rebel.xml: atg-hello-demo\services\rebel.xml
  • <?xml version="1.0" encoding="UTF-8"?>
    <application xmlns:xsi="" xmlns="" xsi:schemaLocation="">
           <dir name=""> </dir>

    This “services” folder will be added to the classpath of the application.

    Now we create the configuration for the service

  • Create a folder: atg-hello-demo\config
  • Create a folder: atg-hello-demo\config\test
  • Create a properties file: atg-hello-demo\config\test\
  • $class=demo.TestService

    Now the configuration of the service is complete.

    Configuring the database

    ATG supports data sources configured by your application server. Because we want to make a simple example and don’t want the user to install a database server we decided to use HSQLDB.

  • Create a folder: atg-hello-demo\lib
  • From the hsqldb site download: commons-dbcp.jar and hsqldb.jar and add them to the lib folder.
  • Create a script file for the initial data: atg-hello-demo\services\database.script
  • The actual project is also available at our github project. It includes the default DB tables that the ATG core needs to run. We created this script based on the MySQL script provided with ATG, so with a newer/older ATG version some things might be different.

  • Configure ATG to use the new database. Create the needed folders to make the following file: atg-hello-demo\config\atg\dynamo\service\jdbc\
  • $class=org.apache.commons.dbcp.BasicDataSource

    Finishing the application

    Now we have only a few things left to do before the demo is ready.

  • Create a folder: atg-hello-demo\META-INF
  • Create a META-INF directory under it and add MANIFEST.MF. This describes your new ATG module. An example of the manifest file would be:
  • Manifest-Version: 1.0
    ATG-Product: atg-hello-demo
    ATG-Version: 10.1
    ATG-Config-Path: config/
    ATG-Class-Path: lib/commons-dbcp.jar lib/hsqldb.jar services
    ATG-Web-Module: demo

    Explanations of the parameters:

  • ATG-Product: atg-hello-demo — Name of this module
  • ATG-Config-Path: config/ — ATG configuration/properties files for this module
  • ATG-Class-Path: lib/commons-dbcp.jar lib/hsqldb.jar services — Additional jars and Java classes used by all the applications of this module.
  • ATG-Web-Module: demo — The demo application for this module
  • Testing the application

    Now that your application is ready, you can package it to deploy on the server you’ve already configured. Go to ATG home\bin of the ATG installation and run:

    runAssembler testDemoEar.ear -m atg-hello-demo

    Now you can deploy the testDemoEar.ear on your local machine and if you go to the applications test URL, in our case with weblogic: http://localhost:7001/demo/index.jsp

    You should see:

    Hello World! My age is 5

    Testing the reloading, from “World” to “Rebel”

    Now to test that we need to make some changes:

    go to atg-hello-demo\config\test\ and change




    go to atg-hello-demo\services\demo\ and change

    out.println ("World! My age is "+age)


    out.println ("Rebel! My age is "+age)

    Set the environment for compiling: home\bin>dynamoEnv.bat

    And compile the TestService: atg-hello-demo\services>javac demo\

    Refresh your browser and you should see:

    Hello Rebel! My age is 25

    Just a reminder, this demo application is available at Github project.

    Final Words

    ATG might have started in the early days of modern IT, but it doesn’t mean you still need to reside in the old days of Java with slow restarts for every change you make to a configuration file or class structure. For you ATG users out there that are tired of long restarts every time you make a change, then try JRebel out.

    We depend on your feedback for this sort of thing too, please know that we’ll be grateful if you let us know how useful it is, what, if anything, does not work, and if there are any other support for ATG that you’d like to see. You can leave comments below, or write to me directly at

    • Shunmugha Sundaram

      Bump! Just as you people said me you have put-forth a doc. That’s really nice :) Will surely give a try.

    • arhan

      Great! be sure to give as feedback and feature requests if any!

    • Andres Luuk

      Our ATG plugin is not actually in JRebel 5.0.1 (released in July) but it will be in the next version in a few days.
      So if you try it before that, then you should actually use our nightly build:

    • Andres Luuk

      Our ATG plugin is not actually in JRebel 5.0.1 (released in July) but it will be in the next version in a few days.
      So if you try it before that, then you should actually use our nightly build:

    • lokivog

      It is really great to see jrebel supporting ATG. I have been using jrebel with ATG for over 5 years now for basic class reloading so it’s exciting to know that more features will be supported. With that said, after downloading the new 5.1 release, I was not able to see my config file reloaded on my custom module. I do not use any of the IDE jrebel plugins so I’m not sure if I’m missing a startup parameter and couldn’t find any docs on enabling the ATG plugin. Is there a startup param for ATG such as -Drebel.atg_core_plugin=true?

    • arhan

      Yes, there’s a -Drebel.atg_plugin option but it is set to true by default. Could you send the info about your issue to our support and send us the logs as well?

    • Andres

      I have downloaded the module atg-hello-demo from and extracted it under C:ATGATG10.0.3. I have downloaded Eclipse Juno and created

      workspace that pointed to the module C:ATGATG10.0.3atg-hello-demo. I downloaded the JRebel Plugin I executed the command runAssembler testDemoEar.ear -m atg-hello-demo to package the module as testDemo.ear and deployed the

      ear in Weblogic. Started Weblogic and invoked the URL in Browser http://localhost:7001/demo/index.jsp

      Hello World! My age is 5


      Then modified



      Invoked the URL in Browser http://localhost:7001/demo/index.jsp

      Hello World! My age is 5

      It is still picking up the old value from the component.

      Let me know if I have followed any wrong step.



    • Andres Luuk

      Hi Ravindra!
      The steps you made seem to be correct, but I think you forgot to recompile the service class.
      Currently the reloading of the backing class is the trigger for the Nucleuse reinit, because I presume that usually you change the properties file when a new field is added to the bean.

      If you did recompile the class, but JRebel did not reload the class then probably the path to rebel.xml is incorrect.

    • santhi

      Ok andres Congratualtions to JRebel team, you got it work but this does not mean this is going to be useful for the ATG users. ATG is more than just the service class. Beleive I have 15 years of ATG experience, it is not that simple as you write it in a blog. You are too optimistic to sell it to ATG customers.

    • What would you like to have improved so that JRebel + ATG would appeal to you?

    • arhan

      Basically, the blog post demonstrates that it is possible to integrate with ATG and we would like to encourage the users/experts like you to suggest, what should we support in ATG to make the integration useful. I agree, currently there’s not much of a value in this integration and it can be extended and improved.

    • What if there is no change in service class then this is a problem. While developing / debugging ATG applications on local dev environment, the developers make the changes in properties file like modifying the values in the properties file. I was hoping that the modified value will be be picked up by JRebel and make it available in the server.

    • I tried demo app, but it’s seems does not work with remoting.

      I’m constantly getting an exception Not in GZIP format


      [time] JRebel-Remoting: Creating new RemotingContext
      [time] JRebel-Remoting: Error! Unable to create RemotingContext
      [time] java.lang.RuntimeException: Unable to parse protocol of the url

      Please advise what should I do


    • Andres Luuk

      We will take this into consideration and try to implement it.

    • Gus

      Hey, this is briliant!

      I have had the idea of creating some kind of plugin for JRebel to reload ATG Components in the backburner for some time, although I have been putting it off…

      I´m going to try it now.

      Also, it would be quite cool if you guys could reload ATG Repositories when changing the XML configurations.

      Repositories are the ATG proprietary ORM which is configured through a set of XML files to define the Entity mappings.


    • jegodine

      Hi, I have the same problem, with de rebel-remoting, enyone know how to resolve this?

    • arhan

      Could you please report this issue to a forum. Blog post comments aren’t best suited for issue tracking :)

    • arhan

      Report to our forum please.

    • Steve Dere

      Did the reloading of properties files make it into the latest jrebel release? Also does it support changes to the (xml) repository mapping?

    • Andres Luuk

      The reloading of the properties without java class changes is not jet implemented.
      JRebel does not have any support for changing the location of the repositories. We relay on ATG dev mode for getting the repository location from inside your workspace.
      ATG had some parameter to specify a custom location for the repository, but I could not refind it currently.

    • Suresh

      I have around 7 years experience in ATG and I succesfully integrated JRebel with ATG in a simple manner.

    • Suresh

      I successfully integrated JRebel with ATG without any plugin.

    • arhan

      Could you share the insights? What do you mean by “simple manner”? Can it handle all the changes you require in development?

    • arhan

      Hey Gus!

      If you could share any sample ATG apps that would be super-awesome!

    • santhi

      I can provide some ideas why it is hard to do hotdeploy with ATG other than class changes in methods and how you guys can over come these issues. Before Oracle acquistion of ATG there was bit of development using groovy to reload atg component after making changes in Java classes. Let me know if I can be any helpful.

    • arhan

      Why not. You can share the ideas right here! :)

    • Prabhat Mishra

      Even after recompiling class I don’t see property file changes reflecting. Did this work for anyone here?

    • Suresh


      Sorry for replying after one year!!. I used the following configurations to reflect the changes in any Java class which should be reloaded by JRebel.

      1.Every ATG application it contains an atg_bootstrap_ejb.jarMETA-INF

      There is one property called Class-Path,which is the classpath of the ear.(The classpath should be collapsed)In my case, it is ./atglib/classes.jar

      2.Just unzip the classes.jar in the same folder and put rebel.xml here.In rebel.xml,The dir should be the workspace of my eclipse classes folder.(I am using eclipse IDE).
      3.Then,change the Class-Path entry to ./atglib(in my case).

      4.Then setting jrebel.jar as my agent in my application server and restart my app server.

      5.I modified any .java class in my eclipse and access the page where this component is using and able to see my changes in the business logic in that particular component..

    • Obed Murillo

      Hi All,
      I recently make ATG10.1.2 configuration changes and worked very good, here are the steps that I did.