Running Java Applications as a Windows Service

By: Rick Proctor

Abstract: An example of how to turn a Java class into a Windows service using the open source Java Service Wrapper project.

Running Java Applications as a Windows Service – By Rick Proctor

Introduction

Have you ever needed to run a Java class unattended on a Windows server? There are various ways to accomplish this task. By far, the best alternative is to run your Java class as a Windows service. One of the easiest tools I’ve found for turning classes into services is the open source Java Service Wrapper project from Tanukisoftware.org (http://wrapper.tanukisoftware.org/doc/english/index.html). According to their website, the Java Service Wrapper is an application which has evolved out of a desire to solve a number of problems common to many Java applications:

  • Run as a Windows Service or Unix Daemon
  • Application Reliability
  • Standard, Out of the Box Scripting
  • On Demand Restarts
  • Flexible Configuration
  • Ease Application Installations
  • Logging

In this article, we’ll focus on the first bullet point.

Note: There are three ways you can use the Java Service Wrapper. In this article we will use the WrapperSimpleApp class to launch our application.

First Things First

Following the link above, download and install the latest version the Java Service Wrapper (for Windows users it comes in a zip file). For this example, I used version 3.0.5. I extracted the file to my C: drive and it created the following directory C:/wrapper_win32_3.0.5. Since I can’t know where you are placing the files, for the rest of the article we’ll refer to the wrapper home folder as %wrapper home%.

Looking at the tree structure, you’ll see several folders including:

  • bin: contains the batch files needed to run the Java Service Wrapper and the Wrapper.exe file.
  • conf: contains the wrapper.conf file.
  • lib: contains the wrapper.dll file, wrapper.jar, and wrappertest.jar.
  • doc: contains the documentation

The bin Folder

The bin folder contains several files with a .bat.in extension. For this example, you and I are only concerned with the App.bat.in file, the InstallApp-NT.bat.in file, and the UninstallApp-NT.bat.in file. These files need to be renamed to a .bat extension.
Once you’ve done that, run the App.bat from a command line. You should see the following results:

Now that we know the test works, let’s make one of our own Java classes work.

Creating a Windows Service

The first thing we need to do is choose a Java class to turn into a service. In this example, we’re going to use a class called MultipleSocket server. The code for this class can be downloaded from CodeCentral by clicking here. Once you’ve downloaded the code, find the bdn.jar file and move it to the [wrapper folder]/bin directory.

On my PC I set up JAVA_HOME and CLASSPATH environmental variables as well as provided a path to the %JAVA_HOME%/bin folder to make it easier to run java classes from the command line. I’m going to assume that you’ve done the same thing. If you haven’t, then you’ll need to provide the full path to the java.exe file in the next examples.

Let’s test the bdn.jar file to make sure that everything’s ok. At a command prompt, type:


java -cp bdn.jar bdn.MultipleSocketServer

After you hit the enter key you should see a screen similar to this:

Note: Use Ctrl-C to exit the program.

The next thing we need to do is to modify the wrapper.conf file. As mentioned earlier, this file can be found in the %wrapper home%/conf directory. In this file we are going to make the following changes:

change:


wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main

to


wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp

add:


wrapper.java.classpath.3=bdn.jar

below:


wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../lib/wrappertest.jar

change:


#wrapper.app.parameter.1=

to


wrapper.app.parameter.1=bdn.MultipleSocketServer

change:


  wrapper.ntservice.name=@app.name@
  wrapper.ntservice.displayname=@app.long.name@
  wrapper.ntservice.description=@app.description@
 

to:


  wrapper.ntservice.name=MultipleSocketserver
  wrapper.ntservice.displayname=MultipleSocketServer
  wrapper.ntservice.description=MultipleSocketServer Test
  

And save the file.

Now let’s test our creation. At the command prompt run:


%wrapper home%/bin/App

You should see the following:

Now that we’ve tested our class, let’s turn it into a fullfledged service. At the command prompt run:


%wrapper home%/bin/InstallApp-NT.bat

You should see the following:

Let’s make sure that Windows recognizes the MultipleSocketServer class as a Service. Click on the “services” icon, found in the administrative tools option of the control panel. You should see a screen similar to this:

Notice that the MultipleSocketServer service is not started. To start it, you can select it and click start, or you can run the App.bat file again. Once you’ve started the MultipleSocketService, it will continue to run until you stop it, disable it, or run the UnistallApp-NT.bat file. Congratulations…you have just built a Java based Windows service.

Summary

The Java Service Wrapper from Tanukisoftware.org is an excellent open source set of programs that allow you to turn your Java classes into Windows services. It provides three methods for accomplishing this task. We discussed only one method here, but I encourage you to read through the documentation and experiment with the other methods as well.


About the Author

Rick Proctor has over 20 years experience in the IT industry. Since 2001 Rick has been Vice President of Information Technology for Thomas Nelson, Inc. (NYSE: TNM). Rick can be reached at tech_dude@yahoo.com.

The source code for MultipleSocketServer.java can be found at CodeCentral.


Server Response from: ETNASC03