【Java】【Tomcat】 Tomcat を Java から 開始・停止 する ~その1~

1-1) Bootstrapを利用する

準備

 * $CCATALINA_HOME/bin内のjarファイル「bootstrap.jar」「commons-daemon.jar」「tomcat-juli.jar」を
   事前に追加しておくこと

サンプル

TomcatStartter.java

* Tomcat の開始
import org.apache.catalina.startup.Bootstrap;

public class TomcatStartter {
   public static void main(String[] args) {
      try {
         TomcatStartter.start();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
   
   private static void start() {
      try {
         Bootstrap bootstrap = new Bootstrap();
         bootstrap.setCatalinaHome("C:/tomcat7");
         //bootstrap.setCatalinaBase("C:/tomcat7Sub1");
         bootstrap.init();
         bootstrap.setAwait(true);
         bootstrap.start();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

TomcatStopper.java

* Tomcat の停止
import org.apache.catalina.startup.Bootstrap;

public class TomcatStopper {
   public static void main(String[] args) {
      try {
         TomcatStopper.stop();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
   
   private static void stop() {
      try {
         Bootstrap bootstrap = new Bootstrap();
         bootstrap.setCatalinaHome("C:/tomcat7");
         //bootstrap.setCatalinaBase("C:/tomcat7Sub1");
         bootstrap.init();
         bootstrap.setAwait(true);
         bootstrap.stopServer();
         bootstrap.destroy();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

注意

http://blogs.yahoo.co.jp/dk521123/33610584.html
で行ったように、複数のインスタンスを動かすような場合は、
setCatalinaBase()を指定する(コメントアウトしている個所に注目)

 * Tomcat8 できない!??(エラーでた)

参考文献

http://telecastravinsky.blog.fc2.com/blog-entry-9.html
Bootstrapのソース
http://www.docjar.com/html/api/org/apache/catalina/startup/Bootstrap.java.html
BootstrapのAPI仕様
https://tomcat.apache.org/tomcat-8.0-doc/api/org/apache/catalina/startup/Bootstrap.html

1-2) shutdownポートを利用する(停止のみ)

サンプル

TomcatStopper2.java

import java.io.PrintWriter;
import java.net.Socket;

public class TomcatStopper2 {
   public static void main(String[] args) {
      try {
         System.out.println("stopping");
         TomcatStopper2.stop();
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }

   private static void stop() {
      try (Socket socket = new Socket("localhost", 8005)) {
         if (socket.isConnected()) {
            try (PrintWriter printWriter = 
                  new PrintWriter(socket.getOutputStream(), true)) {
               printWriter.println("SHUTDOWN");
            }
         }
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

注意

http://blogs.yahoo.co.jp/dk521123/33578498.html
で述べたように、 shutdownポートにデフォルトの場合はtelnetで接続して「SHUTDOWN」と
文字列を打ち込むことでTomcatを停止できてしまうので変更しておいた方がいいので
修正例を以下に記載しておく。

$CATALINA_HOME/conf/server.xml で、以下の箇所を修正。

【修正前】
<Server port="8005" shutdown="SHUTDOWN">

【修正後(あくまで修正例)】
<Server port="28005" shutdown="SampleShutDownCommand">

【Javaの修正】
try (Socket socket = new Socket("localhost", 28005)) {
 ・・・
 printWriter.println("SampleShutDownCommand");

参考文献

http://stackoverflow.com/questions/21321897/start-and-stop-tomcat-from-java-code

関連記事

TomcatJava から 開始・停止 する ~その1~

http://blogs.yahoo.co.jp/dk521123/33690911.html

TomcatJava から 開始・停止 する ~その2~

http://blogs.yahoo.co.jp/dk521123/34689533.html