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

2-1) バッチ/シェルを直接起動する

* 外部コマンドを実行する / ProcessBuilder
 * Java1.5から 外部コマンドを実行できる ProcessBuilder を使用して、
   バッチ/シェルを実行する
http://blogs.yahoo.co.jp/dk521123/34842155.html

サンプル

TomcatStartter.java

* Tomcat の開始
public class TomcatStartter {
   public static void main(String[] args) {
      try {
         String command = "C:/tomcat/tomcat8/bin/startup.bat";
         ProcessBuilder processBuilder = new ProcessBuilder(command);
         Process process = processBuilder.start();
         int result = process.waitFor();
         System.out.println("Done " + result);
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

TomcatStopper.java

* Tomcat の停止
public class TomcatStopper {
   public static void main(String[] args) {
      try {
         String command = "C:/tomcat/tomcat8/bin/shutdown.bat";
         ProcessBuilder processBuilder = new ProcessBuilder(command);
         Process process = processBuilder.start();
         int result = process.waitFor();
         System.out.println("Done " + result);
      } catch (Exception ex) {
         ex.printStackTrace();
      }
   }
}

注意

 * Tomcat停止時には、以下のエラーでうまく動かないことがある

エラー内容

The CATALINA_HOME ennviroment variable is not defined correctly
This enviroment variable is needed to run this program.

解決策

 * 環境変数 CATALINA_HOME を設定する(Eclipseで動かしていたら再起動)

2-2) 組み込みTomcatを利用する

 * Tomcat 7から提供された「org.apache.catalina.startup.Tomcat」クラスを利用する

サンプル

EmbeddedTomcatStartter.java

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

import com.sample.servlet.HelloWorldServlet;

public class EmbeddedTomcatStartter {
   public static void main(String[] args) {
      try {
          Tomcat tomcat = new Tomcat();
          Context context = tomcat.addContext("/", ".");
          Tomcat.addServlet(context, "HelloWorldServlet", new HelloWorldServlet());
          context.addServletMapping("/HelloWorldServlet", "HelloWorldServlet");
          tomcat.start();
          tomcat.getServer().await();
      } catch (LifecycleException ex) {
          ex.printStackTrace();
      }
  }
}
* Tomcat の停止は、上記のtomcat をとっておき、tomcat.stop()で可能?

HelloWorldServlet.java

http://blogs.yahoo.co.jp/dk521123/32073184.html
と同じ
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class HelloWorldServlet.
 */
public class HelloWorldServlet extends HttpServlet {
   private static final long serialVersionUID = 1L;

   /**
    * @see HttpServlet#HttpServlet().
    */
   public HelloWorldServlet() {
      super();
   }

   protected void doGet(HttpServletRequest request, HttpServletResponse response)
         throws ServletException, IOException {
      response.setContentType("text/html");
      PrintWriter out = response.getWriter();

      out.println("<html><body>");
      out.println("<p>Hello World!</p>");
      out.println("</body></html>");
   }

   protected void doPost(HttpServletRequest request,
         HttpServletResponse response) throws ServletException, IOException {
      this.doGet(request, response);
   }
}

確認方法

EmbeddedTomcatStartterを起動してから、ブラウザで以下を表示すると
「Hello World!」が表示されたらOK
[http://localhost:8080/HelloWorldServlet]

注意

 * 以下のエラーが表示されたら、以下の関連記事を参照のこと
  +「NoClassDefFoundError: org/apache/juli/logging/LogFactory」が表示される
  +「LifecycleException: Failed to start component」が表示される
http://blogs.yahoo.co.jp/dk521123/34691085.html

参考文献

http://www.atmarkit.co.jp/ait/articles/1106/24/news113_2.html

関連記事

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

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

外部プログラム/コマンドを実行するには ~ ProcessBuilder ~

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