Fixes ACTIVEMQ6-99: Support installing as a windows service

This commit is contained in:
Hiram Chirino 2015-04-16 23:00:29 -04:00
parent 3b82dc52ed
commit e12388ff44
3 changed files with 135 additions and 31 deletions

View File

@ -61,6 +61,14 @@
<groupId>io.airlift</groupId> <groupId>io.airlift</groupId>
<artifactId>airline</artifactId> <artifactId>airline</artifactId>
</dependency> </dependency>
<dependency>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>
<version>1.9</version>
<classifier>bin</classifier>
<type>exe</type>
<scope>test</scope>
</dependency>
<dependency> <dependency>
<groupId>junit</groupId> <groupId>junit</groupId>
<artifactId>junit</artifactId> <artifactId>junit</artifactId>
@ -102,6 +110,36 @@
</includes> </includes>
</resource> </resource>
</resources> </resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.2</version>
<executions>
<execution>
<id>unpack</id>
<phase>process-resources</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<artifactItems>
<artifactItem>
<groupId>com.sun.winsw</groupId>
<artifactId>winsw</artifactId>
<version>1.9</version>
<classifier>bin</classifier>
<type>exe</type>
<outputDirectory>${basedir}/target/classes/org/apache/activemq/cli/commands/bin</outputDirectory>
<destFileName>activemq-service.exe</destFileName>
</artifactItem>
</artifactItems>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build> </build>

View File

@ -97,24 +97,7 @@ public class Create implements Action
host = directory.getName(); host = directory.getName();
} }
new File(directory, "bin").mkdirs();
new File(directory, "etc").mkdirs();
new File(directory, "log").mkdirs();
new File(directory, "tmp").mkdirs();
new File(directory, "data").mkdirs();
write("bin/activemq", null, true);
makeExec("bin/activemq");
write("bin/activemq.cmd", null, false);
write("bin/activemq-service", null, true);
makeExec("bin/activemq-service");
write("etc/logging.properties", null, false);
write("etc/bootstrap.xml", null, false);
HashMap<String, String> filters = new HashMap<String, String>(); HashMap<String, String> filters = new HashMap<String, String>();
String replicatedSettings = ""; String replicatedSettings = "";
if (replicated) if (replicated)
{ {
@ -149,15 +132,37 @@ public class Create implements Action
filters.put("${activemq.instance}", path(directory, false)); filters.put("${activemq.instance}", path(directory, false));
filters.put("${java.home}", path(System.getProperty("java.home"), false)); filters.put("${java.home}", path(System.getProperty("java.home"), false));
write("etc/activemq.profile", filters, true); new File(directory, "bin").mkdirs();
makeExec("etc/activemq.profile"); new File(directory, "etc").mkdirs();
new File(directory, "log").mkdirs();
new File(directory, "tmp").mkdirs();
new File(directory, "data").mkdirs();
write("etc/activemq.profile.cmd", filters, false);
if (IS_WINDOWS)
{
write("bin/activemq.cmd", null, false);
write("bin/activemq-service.exe");
write("bin/activemq-service.xml", filters, false);
write("etc/activemq.profile.cmd", filters, false);
}
if (!IS_WINDOWS || IS_CYGWIN)
{
write("bin/activemq", null, true);
makeExec("bin/activemq");
write("bin/activemq-service", null, true);
makeExec("bin/activemq-service");
write("etc/activemq.profile", filters, true);
makeExec("etc/activemq.profile");
}
write("etc/logging.properties", null, false);
write("etc/bootstrap.xml", null, false);
write("etc/activemq-configuration.xml", filters, false); write("etc/activemq-configuration.xml", filters, false);
write("etc/activemq-roles.properties", null, false); write("etc/activemq-roles.properties", null, false);
write("etc/activemq-users.properties", null, false); write("etc/activemq-users.properties", null, false);
context.out.println(""); context.out.println("");
context.out.println("You can now start the broker by executing: "); context.out.println("You can now start the broker by executing: ");
context.out.println(""); context.out.println("");
@ -189,15 +194,16 @@ public class Create implements Action
} }
} }
// if ( IS_WINDOWS ) { if (IS_WINDOWS)
// {
// context.out.println("Or you can setup the broker as Windows service and run it in the background:");
// context.out.println(""); context.out.println("Or you can setup the broker as Windows service and run it in the background:");
// context.out.println(String.format(" \"%s\" install", path(service,true))); context.out.println("");
// context.out.println(String.format(" \"%s\" start", path(service, true))); context.out.println(String.format(" \"%s\" install", path(service, true)));
// context.out.println(""); context.out.println(String.format(" \"%s\" start", path(service, true)));
// context.out.println("");
// }
}
return null; return null;
} }
@ -282,8 +288,9 @@ public class Create implements Action
return new String(out.toByteArray(), "UTF-8"); return new String(out.toByteArray(), "UTF-8");
} }
private void write(String source, File target) throws IOException private void write(String source) throws IOException
{ {
File target = new File(directory, source);
if (target.exists() && !force) if (target.exists() && !force)
{ {
throw new RuntimeException(String.format("The file '%s' already exists. Use --force to overwrite.", target)); throw new RuntimeException(String.format("The file '%s' already exists. Use --force to overwrite.", target));

View File

@ -0,0 +1,59 @@
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<service>
<id>activemq-${host}</id>
<name>ActiveMQ: ${host}</name>
<description>Apache ActiveMQ is a reliable messaging broker</description>
<logpath>${activemq.instance}\log</logpath>
<logmode>roll</logmode>
<executable>"${java.home}\bin\java.exe"</executable>
<argument>-XX:+UseParallelGC</argument>
<argument>-XX:+AggressiveOpts</argument>
<argument>-XX:+UseFastAccessorMethods</argument>
<argument>-Xms512M</argument>
<argument>-Xmx1024M</argument>
<!-- Cluster Properties: Used to pass arguments to ActiveMQ which can be referenced in activemq-configuration.xml
<argument>-Dactivemq.remoting.default.port=61617</argument>
<argument>-Dactivemq.remoting.amqp.port=5673</argument>
<argument>-Dactivemq.remoting.stomp.port=61614</argument>
<argument>-Dactivemq.remoting.hornetq.port=5446</argument>
-->
<argument>-classpath</argument>
<argument>"${activemq.home}\lib\activemq-boot.jar"</argument>
<argument>"-Dactivemq.home=${activemq.home}"</argument>
<argument>"-Dactivemq.instance=${activemq.instance}"</argument>
<argument>"-Ddata.dir=${activemq.instance}/data"</argument>
<argument>-Djava.util.logging.manager=org.jboss.logmanager.LogManager</argument>
<argument>"-Dlogging.configuration=file:${activemq.instance}\etc\logging.properties"</argument>
<!-- Debug args: Uncomment to enable debug
<argument>-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=5005</argument>
-->
<argument>org.apache.activemq.boot.ActiveMQ</argument>
<argument>run</argument>
</service>