The following shows how to generate start scripts to make an application run as a Linux daemon.
The setup is based on Java Service Wrapper (JSW) version 3.2.3, using the version 3.2.3.
This is the simplest configuration according to JSW documentation, which invokes a main method on start, and kills the VM on stop. Here is an example usage:
<project> [...] <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <repositoryLayout>flat</repositoryLayout> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <daemons> <daemon> <id>app1</id> <!-- the next line is added by default if you don't have wrapperMainClass's setting --> <wrapperMainClass>org.tanukisoftware.wrapper.WrapperSimpleApp</wrapperMainClass> <mainClass>org.codehaus.mojo.SomeMainClass</mainClass> <commandLineArguments> <commandLineArgument>start</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
<project> [...] <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <repositoryLayout>flat</repositoryLayout> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <daemons> <daemon> <id>app1</id> <!-- the next line is added by default if you dont have wrapperMainClass's setting --> <wrapperMainClass>org.tanukisoftware.wrapper.WrapperStartStopApp</wrapperMainClass> <mainClass>org.codehaus.mojo.SomeMainClass</mainClass> <commandLineArguments> <commandLineArgument>fill.your.arguments</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
The below example assumes you have a main class that implements org.tanukisoftware.wrapper.WrapperListener interface.
<project> [...] <dependencies> <dependency> <!-- this must match with the actual JSW runtime distribution, the scope must set as provided since this plugin already add wrapper.jar into the classpath --> <groupId>tanukisoft</groupId> <artifactId>wrapper</artifactId> <version>3.2.3</version> <scope>provided</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <repositoryLayout>flat</repositoryLayout> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <daemons> <daemon> <id>app1</id> <wrapperMainClass>org.codehaus.mojo.SomeMainClass</wrapperMainClass> <commandLineArguments> <commandLineArgument>fill.your.arguments</commandLineArgument> </commandLineArguments> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
The below example assumes you are using org.tanukisoftware.wrapper.WrapperJarApp to start your app, and your current project has main class configured via its manifest.
<project> [...] <dependencies> [...] </dependencies> <build> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>appassembler-maven-plugin</artifactId> <version>1.10</version> <executions> <execution> <id>generate-jsw-scripts</id> <phase>package</phase> <goals> <goal>generate-daemons</goal> </goals> <configuration> <repositoryLayout>flat</repositoryLayout> <includeConfigurationDirectoryInClasspath>true</includeConfigurationDirectoryInClasspath> <daemons> <daemon> <id>app1</id> <wrapperMainClass>org.tanukisoftware.wrapper.WrapperJarApp</wrapperMainClass> <platforms> <platform>jsw</platform> </platforms> </daemon> </daemons> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
$ mvn package $ chmod +x target/generated-resources/appassembler/jsw/app1/bin/app1 $ chmod +x target/generated-resources/appassembler/jsw/app1/bin/wrapper-linux-x86-32 $ target/generated-resources/appassembler/jsw/app1/bin/app1 start $ ps -ef | grep java (to check that it is running) $ target/generated-resources/appassembler/jsw/app1/bin/app1 stop
E.g. add something like the following to your Main method:
Runtime.getRuntime().addShutdownHook(new Thread(){ public void run() { log.debug("Shutdown hook was invoked. Shutting down App1."); App1JmxStopper appJmxStopper = new App1JmxStopper(); appJmxStopper.stop(); } });