Java Servletコンテナ、Webサーバの Jetty についてインストールからWebアプリケーションをデプロイして起動するまでの手順です。
Jettyのインストールと起動
Jetty を ダウンロード して展開、実行ユーザーを作成します。
$ curl -LO http://central.maven.org/maven2/org/eclipse/jetty/jetty-distribution/9.4.6.v20170531/jetty-distribution-9.4.6.v20170531.tar.gz $ tar zxvf jetty-distribution-9.4.6.v20170531.tar.gz $ sudo mv jetty-distribution-9.4.6.v20170531 /opt/jetty-9.4.6 $ sudo ln -s /opt/jetty-9.4.6 /opt/jetty $ sudo useradd -M -s /bin/false jetty $ sudo chown -RH jetty:jetty /opt/jetty
起動スクリプトをコピーして自動起動を設定します。
$ sudo ln -s /opt/jetty/bin/jetty.sh /etc/init.d/jetty
$ sudo update-rc.d jetty defaults
Jetty の設定ファイルを作成します。
$ sudo touch /etc/default/jetty
上記ファイルに必要な情報を記述してください。
export JAVA_OPTIONS="-Xmx2048m -Xms2048m -server -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled" JETTY_HOME=/opt/jetty JETTY_BASE=/opt/jetty JETTY_USER=jetty JETTY_START_LOG=$JETTY_HOME/logs/start.log TMPDIR=/opt/jetty/tmp
JETTY_BASE
は Jetty 以外のディレクトリを指定することもできます。その場合、対象のディレクトリにはwebapps
とstart.ini
のみ作成してください。デプロイ先もそちらになります。
$ ll /opt/myapp/ total 24 drwxr-xr-x 3 jetty jetty 4096 Jun 11 15:36 ./ drwxr-xr-x 7 root root 4096 Jun 11 15:34 ../ -rw-r--r-- 1 jetty jetty 5701 Jun 11 15:35 start.ini drwxr-xr-x 2 jetty jetty 4096 Jun 11 15:35 webapps/
start
で Jetty を起動します。localhost:8080
でアクセスできますがまだアプリケーションが無いので何も表示されません。
$ sudo /etc/init.d/jetty start Starting Jetty: OK Sun Jun 11 09:01:42 UTC 2017
status
コマンドで起動オプション等が確認できます。
$ sudo /etc/init.d/jetty status Jetty running pid=17776 JAVA = /opt/java/bin/java JAVA_OPTIONS = -Xmx2048m -Xms2048m -server -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Djetty.home=/opt/jetty -Djetty.base=/opt/jetty -Djava.io.tmpdir=/opt/jetty/tmp JETTY_HOME = /opt/jetty JETTY_BASE = /opt/jetty START_D = /opt/jetty/start.d START_INI = /opt/jetty/start.ini JETTY_START = /opt/jetty/start.jar JETTY_CONF = /opt/jetty/etc/jetty.conf JETTY_ARGS = jetty.state=/opt/jetty/jetty.state jetty-started.xml JETTY_RUN = /var/run/jetty JETTY_PID = /var/run/jetty/jetty.pid JETTY_START_LOG= /opt/jetty/logs/start.log JETTY_STATE = /opt/jetty/jetty.state RUN_CMD = /opt/java/bin/java -Xmx2048m -Xms2048m -server -XX:+UseConcMarkSweepGC -XX:+CMSClassUnloadingEnabled -Djetty.home=/opt/jetty -Djetty.base=/opt/jetty -Djava.io.tmpdir=/opt/jetty/tmp -jar /opt/jetty/start.jar jetty.state=/opt/jetty/jetty.state jetty-started.xml
起動に失敗した場合はstart.log
に記録されます。
$ sudo /etc/init.d/jetty start Starting Jetty: FAILED Sun Jun 11 09:05:46 UTC 2017
$ less /opt/jetty/logs/start.log StartLog Establishing /opt/jetty/logs/start.log on Sun Jun 11 09:01:38 UTC 2017 StartLog Establishing /opt/jetty/logs/start.log on Sun Jun 11 09:05:42 UTC 2017 java.nio.file.NoSuchFileException: /opt/jetty/tmp/start_2236825206687154186.properties at sun.nio.fs.UnixException.translateToIOException(UnixException.java:86) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102) at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107) at sun.nio.fs.UnixFileSystemProvider.newByteChannel(UnixFileSystemProvider.java:214) ...
Startup a Unix Service using jetty.sh
Servletのサンプルアプリケーション
Gradle プロジェクトで Servlet のサンプルアプリケーションを作成します。
group 'com.task_notes' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'war' sourceCompatibility = 1.8 repositories { mavenCentral() } dependencies { providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0' }
src/main/java/com/task_notes/HelloServlet.java
に以下のコードを作成します。
package com.task_notes; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; @WebServlet(name = "hello", urlPatterns = "/") public class HelloServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.getWriter().write("Hello Servlet!"); } }
src/main/webapp/WEB-INF/jetty-web.xml
に jetty-web.xml を作成します。contextPath を指定していますが、これが無くてもlocalhost:8080/jetty-sample
でアクセスすることは可能です。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"> <Configure class="org.eclipse.jetty.webapp.WebAppContext"> <Set name="contextPath">/my</Set> <Set name="war"><SystemProperty name="jetty.base"/>/webapps/jetty-sample.war</Set> </Configure>
War ファイルを生成して Jetty ディレクトリの webapps 配下にデプロイします。シンボリックリンクでも大丈夫です。
$ ./gradlew war $ sudo -u jetty cp ./build/libs/jetty-sample-1.0-SNAPSHOT.war /opt/jetty/webapps/jetty-sample.war $ sudo /etc/init.d/jetty restart
ブラウザからアクセスできたら成功です。