【Java】JettyのインストールとWebアプリケーションデプロイ

スポンサーリンク

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
$ 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 以外のディレクトリを指定することもできます。その場合、対象のディレクトリにはwebappsstart.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.xmljetty-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

ブラウザからアクセスできたら成功です。

f:id:tasukujp:20170612002401p:plain